feat: disable cookie access under restricted sandboxes - #1080

Merged
Marc-Andre-Rivet merged 9 commits into
devfrom
iframe-sandbox-support
Jan 29, 2020
Merged

feat: disable cookie access under restricted sandboxes#1080
Marc-Andre-Rivet merged 9 commits into
devfrom
iframe-sandbox-support

Conversation

@josegonzalez

@josegonzalezjosegonzalez commented Jan 11, 2020

Copy link
Copy Markdown
Contributor

When dash is embedded into an iframe with a sandbox attribute that only has allow-scripts, cookie access is disabled and dash fails to load. As such, we need to restrict our cookie usage by disabling functionality.

This patch removes the disabled functionality in a graceful manner, allowing dash to load in very restricted iframes.

Contributor Checklist

  • I have broken down my PR scope into the following TODO tasks not needed
  • I have run the tests locally and they passed. (refer to testing section in contributing)
  • I have added tests, or extended existing tests, to cover any new features or bugs fixed in this PR

optionals

  • I have added entry in the CHANGELOG.md

@josegonzalez

Copy link
Copy Markdown
ContributorAuthor

Not sure how to fix the Empty block statement error...

@alexcjohnson

Copy link
Copy Markdown
Collaborator

Not sure how to fix the Empty block statement error...

May be worth console.log-ing the error anyway, could be useful to sandbox users for debugging. That would fill the block :)

@josegonzalez

Copy link
Copy Markdown
ContributorAuthor

heh:

Unexpected console statement no-console

@josegonzalez

Copy link
Copy Markdown
ContributorAuthor

@alexcjohnson I've ignored the prettier issue in code for now since there isn't a great way to handle it otherwise.

Do you have any thoughts on how I should write a test for the code? The change itself was manually tested and confirmed working within a large-ish dash app, so I'm fairly confident it works, but I'm not sure how to write tests for the change...

@alexcjohnson

Copy link
Copy Markdown
Collaborator

how I should write a test for the code?

The most robust thing I can think of is to make a container html file (in an assets/ folder next to the test file so dash will serve it) with the actual dash app in a sandboxed iframe - then go interact with the app in the iframe - I've never done that but it looks manageable http://allselenium.info/handling-iframes-using-selenium-webdriver/

@josegonzalez
josegonzalezforce-pushed the iframe-sandbox-support branch 4 times, most recently from 5dbb6af to 6d9660cCompareJanuary 16, 2020 19:45
@josegonzalez

Copy link
Copy Markdown
ContributorAuthor

@alexcjohnson once tests pass (I rebased everything together, they previously passed) this should be good for a re-review/merge :)

document.cookie =
`${constants.OAUTH_COOKIE_NAME}=; ` +
'expires=Thu, 01 Jan 1970 00:00:01 GMT;';
} catch (e) {}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Between an eslint exception allowing error swallowing and an eslint exception for a console.warn entry, I'd rather have the warning. Dash will be operating with limited capabilities and the information should be exposed. Maybe later we can approve it with #1088

Comment threaddash-renderer/src/actions/index.js

dash_duo.driver.get("data:text/html;charset=utf-8," + html_content)

assert not dash_duo.get_logs()

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@josegonzalez I suppose that test failure was predictable.. we now log a warning.. and the test picks it up! You'll want to update assert not dash_duo.get_logs() accordingly

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, the other failures i was talking about previously were eslint errors, but i got them covered.

Comment threadrelease Outdated
When dash is embedded into an iframe with a sandbox attribute that only has allow-scripts, cookie access is disabled and dash fails to load. As such, we need to restrict our cookie usage by disabling functionality.
This patch removes the disabled functionality in a graceful manner, allowing dash to load in very restricted iframes.

dash_duo.driver.get("data:text/html;charset=utf-8," + html_content)

assert len(dash_duo.get_logs()) == 2

@Marc-Andre-RivetMarc-Andre-RivetJan 24, 2020

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@josegonzalez The ==2 part is brittle but ok for now I think -- if you could open an issue to improve this part of the test later, I'm fine as-is. What I would like so see here is some validation that the Dash app actually loaded and works as expected. Maybe select the #btn, click it, and make sure at least one of the divs got updated by the callback.

@Marc-Andre-RivetMarc-Andre-Rivet left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💃

@Marc-Andre-Rivet
Marc-Andre-Rivet merged commit ca58cc4 into devJan 29, 2020
@Marc-Andre-Rivet
Marc-Andre-Rivet deleted the iframe-sandbox-support branch January 29, 2020 21:03
nightsailer added a commit to o3cloud/dash that referenced this pull request Feb 23, 2020
* Add standard dash interface for location change (plotly#1094)
* feat: disable cookie access under restricted sandboxes (plotly#1080)
* IE11 compatibility (plotly#1106)
* Add `inheritAsyncDecorator` for wrapper components (plotly#1109)
* bump version, loosen version requirements
* dcc>=1.7.0, 1.7.1 was JS only
* stricten versions
* stricten table version
Co-authored-by: Marc-André Rivet <Marc-Andre-Rivet@users.noreply.github.com>
Co-authored-by: Jose Diaz-Gonzalez <email@josediazgonzalez.com>
nightsailer added a commit to o3cloud/dash that referenced this pull request Feb 23, 2020
* Add standard dash interface for location change (plotly#1094)
* feat: disable cookie access under restricted sandboxes (plotly#1080)
* IE11 compatibility (plotly#1106)
* Add `inheritAsyncDecorator` for wrapper components (plotly#1109)
* bump version, loosen version requirements
* dcc>=1.7.0, 1.7.1 was JS only
* stricten versions
* stricten table version
Co-authored-by: Marc-André Rivet <Marc-Andre-Rivet@users.noreply.github.com>
Co-authored-by: Jose Diaz-Gonzalez <email@josediazgonzalez.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@josegonzalez@alexcjohnson@Marc-Andre-Rivet
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

feat: disable cookie access under restricted sandboxes - #1080

Merged
Marc-Andre-Rivet merged 9 commits into
devfrom
iframe-sandbox-support
Jan 29, 2020
Merged

feat: disable cookie access under restricted sandboxes#1080
Marc-Andre-Rivet merged 9 commits into
devfrom
iframe-sandbox-support

Conversation

@josegonzalez

@josegonzalezjosegonzalez commented Jan 11, 2020

Copy link
Copy Markdown
Contributor

When dash is embedded into an iframe with a sandbox attribute that only has allow-scripts, cookie access is disabled and dash fails to load. As such, we need to restrict our cookie usage by disabling functionality.

This patch removes the disabled functionality in a graceful manner, allowing dash to load in very restricted iframes.

Contributor Checklist

  • I have broken down my PR scope into the following TODO tasks not needed
  • I have run the tests locally and they passed. (refer to testing section in contributing)
  • I have added tests, or extended existing tests, to cover any new features or bugs fixed in this PR

optionals

  • I have added entry in the CHANGELOG.md

@josegonzalez

Copy link
Copy Markdown
ContributorAuthor

Not sure how to fix the Empty block statement error...

@alexcjohnson

Copy link
Copy Markdown
Collaborator

Not sure how to fix the Empty block statement error...

May be worth console.log-ing the error anyway, could be useful to sandbox users for debugging. That would fill the block :)

@josegonzalez

Copy link
Copy Markdown
ContributorAuthor

heh:

Unexpected console statement no-console

@josegonzalez

Copy link
Copy Markdown
ContributorAuthor

@alexcjohnson I've ignored the prettier issue in code for now since there isn't a great way to handle it otherwise.

Do you have any thoughts on how I should write a test for the code? The change itself was manually tested and confirmed working within a large-ish dash app, so I'm fairly confident it works, but I'm not sure how to write tests for the change...

@alexcjohnson

Copy link
Copy Markdown
Collaborator

how I should write a test for the code?

The most robust thing I can think of is to make a container html file (in an assets/ folder next to the test file so dash will serve it) with the actual dash app in a sandboxed iframe - then go interact with the app in the iframe - I've never done that but it looks manageable http://allselenium.info/handling-iframes-using-selenium-webdriver/

@josegonzalez
josegonzalezforce-pushed the iframe-sandbox-support branch 4 times, most recently from 5dbb6af to 6d9660cCompareJanuary 16, 2020 19:45
@josegonzalez

Copy link
Copy Markdown
ContributorAuthor

@alexcjohnson once tests pass (I rebased everything together, they previously passed) this should be good for a re-review/merge :)

document.cookie =
`${constants.OAUTH_COOKIE_NAME}=; ` +
'expires=Thu, 01 Jan 1970 00:00:01 GMT;';
} catch (e) {}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Between an eslint exception allowing error swallowing and an eslint exception for a console.warn entry, I'd rather have the warning. Dash will be operating with limited capabilities and the information should be exposed. Maybe later we can approve it with #1088

Comment threaddash-renderer/src/actions/index.js

dash_duo.driver.get("data:text/html;charset=utf-8," + html_content)

assert not dash_duo.get_logs()

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@josegonzalez I suppose that test failure was predictable.. we now log a warning.. and the test picks it up! You'll want to update assert not dash_duo.get_logs() accordingly

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, the other failures i was talking about previously were eslint errors, but i got them covered.

Comment threadrelease Outdated
When dash is embedded into an iframe with a sandbox attribute that only has allow-scripts, cookie access is disabled and dash fails to load. As such, we need to restrict our cookie usage by disabling functionality.
This patch removes the disabled functionality in a graceful manner, allowing dash to load in very restricted iframes.

dash_duo.driver.get("data:text/html;charset=utf-8," + html_content)

assert len(dash_duo.get_logs()) == 2

@Marc-Andre-RivetMarc-Andre-RivetJan 24, 2020

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@josegonzalez The ==2 part is brittle but ok for now I think -- if you could open an issue to improve this part of the test later, I'm fine as-is. What I would like so see here is some validation that the Dash app actually loaded and works as expected. Maybe select the #btn, click it, and make sure at least one of the divs got updated by the callback.

@Marc-Andre-RivetMarc-Andre-Rivet left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💃

@Marc-Andre-Rivet
Marc-Andre-Rivet merged commit ca58cc4 into devJan 29, 2020
@Marc-Andre-Rivet
Marc-Andre-Rivet deleted the iframe-sandbox-support branch January 29, 2020 21:03
nightsailer added a commit to o3cloud/dash that referenced this pull request Feb 23, 2020
* Add standard dash interface for location change (plotly#1094)
* feat: disable cookie access under restricted sandboxes (plotly#1080)
* IE11 compatibility (plotly#1106)
* Add `inheritAsyncDecorator` for wrapper components (plotly#1109)
* bump version, loosen version requirements
* dcc>=1.7.0, 1.7.1 was JS only
* stricten versions
* stricten table version
Co-authored-by: Marc-André Rivet <Marc-Andre-Rivet@users.noreply.github.com>
Co-authored-by: Jose Diaz-Gonzalez <email@josediazgonzalez.com>
nightsailer added a commit to o3cloud/dash that referenced this pull request Feb 23, 2020
* Add standard dash interface for location change (plotly#1094)
* feat: disable cookie access under restricted sandboxes (plotly#1080)
* IE11 compatibility (plotly#1106)
* Add `inheritAsyncDecorator` for wrapper components (plotly#1109)
* bump version, loosen version requirements
* dcc>=1.7.0, 1.7.1 was JS only
* stricten versions
* stricten table version
Co-authored-by: Marc-André Rivet <Marc-Andre-Rivet@users.noreply.github.com>
Co-authored-by: Jose Diaz-Gonzalez <email@josediazgonzalez.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@josegonzalez@alexcjohnson@Marc-Andre-Rivet
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: disable cookie access under restricted sandboxes - #1080

Merged
Marc-Andre-Rivet merged 9 commits into
devfrom
iframe-sandbox-support
Jan 29, 2020
Merged

feat: disable cookie access under restricted sandboxes#1080
Marc-Andre-Rivet merged 9 commits into
devfrom
iframe-sandbox-support

Conversation

@josegonzalez

@josegonzalezjosegonzalez commented Jan 11, 2020

Copy link
Copy Markdown
Contributor

When dash is embedded into an iframe with a sandbox attribute that only has allow-scripts, cookie access is disabled and dash fails to load. As such, we need to restrict our cookie usage by disabling functionality.

This patch removes the disabled functionality in a graceful manner, allowing dash to load in very restricted iframes.

Contributor Checklist

  • I have broken down my PR scope into the following TODO tasks not needed
  • I have run the tests locally and they passed. (refer to testing section in contributing)
  • I have added tests, or extended existing tests, to cover any new features or bugs fixed in this PR

optionals

  • I have added entry in the CHANGELOG.md

@josegonzalez

Copy link
Copy Markdown
ContributorAuthor

Not sure how to fix the Empty block statement error...

@alexcjohnson

Copy link
Copy Markdown
Collaborator

Not sure how to fix the Empty block statement error...

May be worth console.log-ing the error anyway, could be useful to sandbox users for debugging. That would fill the block :)

@josegonzalez

Copy link
Copy Markdown
ContributorAuthor

heh:

Unexpected console statement no-console

@josegonzalez

Copy link
Copy Markdown
ContributorAuthor

@alexcjohnson I've ignored the prettier issue in code for now since there isn't a great way to handle it otherwise.

Do you have any thoughts on how I should write a test for the code? The change itself was manually tested and confirmed working within a large-ish dash app, so I'm fairly confident it works, but I'm not sure how to write tests for the change...

@alexcjohnson

Copy link
Copy Markdown
Collaborator

how I should write a test for the code?

The most robust thing I can think of is to make a container html file (in an assets/ folder next to the test file so dash will serve it) with the actual dash app in a sandboxed iframe - then go interact with the app in the iframe - I've never done that but it looks manageable http://allselenium.info/handling-iframes-using-selenium-webdriver/

@josegonzalez
josegonzalezforce-pushed the iframe-sandbox-support branch 4 times, most recently from 5dbb6af to 6d9660cCompareJanuary 16, 2020 19:45
@josegonzalez

Copy link
Copy Markdown
ContributorAuthor

@alexcjohnson once tests pass (I rebased everything together, they previously passed) this should be good for a re-review/merge :)

document.cookie =
`${constants.OAUTH_COOKIE_NAME}=; ` +
'expires=Thu, 01 Jan 1970 00:00:01 GMT;';
} catch (e) {}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Between an eslint exception allowing error swallowing and an eslint exception for a console.warn entry, I'd rather have the warning. Dash will be operating with limited capabilities and the information should be exposed. Maybe later we can approve it with #1088

Comment threaddash-renderer/src/actions/index.js

dash_duo.driver.get("data:text/html;charset=utf-8," + html_content)

assert not dash_duo.get_logs()

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@josegonzalez I suppose that test failure was predictable.. we now log a warning.. and the test picks it up! You'll want to update assert not dash_duo.get_logs() accordingly

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, the other failures i was talking about previously were eslint errors, but i got them covered.

Comment threadrelease Outdated
When dash is embedded into an iframe with a sandbox attribute that only has allow-scripts, cookie access is disabled and dash fails to load. As such, we need to restrict our cookie usage by disabling functionality.
This patch removes the disabled functionality in a graceful manner, allowing dash to load in very restricted iframes.

dash_duo.driver.get("data:text/html;charset=utf-8," + html_content)

assert len(dash_duo.get_logs()) == 2

@Marc-Andre-RivetMarc-Andre-RivetJan 24, 2020

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@josegonzalez The ==2 part is brittle but ok for now I think -- if you could open an issue to improve this part of the test later, I'm fine as-is. What I would like so see here is some validation that the Dash app actually loaded and works as expected. Maybe select the #btn, click it, and make sure at least one of the divs got updated by the callback.

@Marc-Andre-RivetMarc-Andre-Rivet left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💃

@Marc-Andre-Rivet
Marc-Andre-Rivet merged commit ca58cc4 into devJan 29, 2020
@Marc-Andre-Rivet
Marc-Andre-Rivet deleted the iframe-sandbox-support branch January 29, 2020 21:03
nightsailer added a commit to o3cloud/dash that referenced this pull request Feb 23, 2020
* Add standard dash interface for location change (plotly#1094)
* feat: disable cookie access under restricted sandboxes (plotly#1080)
* IE11 compatibility (plotly#1106)
* Add `inheritAsyncDecorator` for wrapper components (plotly#1109)
* bump version, loosen version requirements
* dcc>=1.7.0, 1.7.1 was JS only
* stricten versions
* stricten table version
Co-authored-by: Marc-André Rivet <Marc-Andre-Rivet@users.noreply.github.com>
Co-authored-by: Jose Diaz-Gonzalez <email@josediazgonzalez.com>
nightsailer added a commit to o3cloud/dash that referenced this pull request Feb 23, 2020
* Add standard dash interface for location change (plotly#1094)
* feat: disable cookie access under restricted sandboxes (plotly#1080)
* IE11 compatibility (plotly#1106)
* Add `inheritAsyncDecorator` for wrapper components (plotly#1109)
* bump version, loosen version requirements
* dcc>=1.7.0, 1.7.1 was JS only
* stricten versions
* stricten table version
Co-authored-by: Marc-André Rivet <Marc-Andre-Rivet@users.noreply.github.com>
Co-authored-by: Jose Diaz-Gonzalez <email@josediazgonzalez.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@josegonzalez@alexcjohnson@Marc-Andre-Rivet
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: disable cookie access under restricted sandboxes - #1080

Merged
Marc-Andre-Rivet merged 9 commits into
devfrom
iframe-sandbox-support
Jan 29, 2020
Merged

feat: disable cookie access under restricted sandboxes#1080
Marc-Andre-Rivet merged 9 commits into
devfrom
iframe-sandbox-support

Conversation

@josegonzalez

@josegonzalezjosegonzalez commented Jan 11, 2020

Copy link
Copy Markdown
Contributor

When dash is embedded into an iframe with a sandbox attribute that only has allow-scripts, cookie access is disabled and dash fails to load. As such, we need to restrict our cookie usage by disabling functionality.

This patch removes the disabled functionality in a graceful manner, allowing dash to load in very restricted iframes.

Contributor Checklist

  • I have broken down my PR scope into the following TODO tasks not needed
  • I have run the tests locally and they passed. (refer to testing section in contributing)
  • I have added tests, or extended existing tests, to cover any new features or bugs fixed in this PR

optionals

  • I have added entry in the CHANGELOG.md

@josegonzalez

Copy link
Copy Markdown
ContributorAuthor

Not sure how to fix the Empty block statement error...

@alexcjohnson

Copy link
Copy Markdown
Collaborator

Not sure how to fix the Empty block statement error...

May be worth console.log-ing the error anyway, could be useful to sandbox users for debugging. That would fill the block :)

@josegonzalez

Copy link
Copy Markdown
ContributorAuthor

heh:

Unexpected console statement no-console

@josegonzalez

Copy link
Copy Markdown
ContributorAuthor

@alexcjohnson I've ignored the prettier issue in code for now since there isn't a great way to handle it otherwise.

Do you have any thoughts on how I should write a test for the code? The change itself was manually tested and confirmed working within a large-ish dash app, so I'm fairly confident it works, but I'm not sure how to write tests for the change...

@alexcjohnson

Copy link
Copy Markdown
Collaborator

how I should write a test for the code?

The most robust thing I can think of is to make a container html file (in an assets/ folder next to the test file so dash will serve it) with the actual dash app in a sandboxed iframe - then go interact with the app in the iframe - I've never done that but it looks manageable http://allselenium.info/handling-iframes-using-selenium-webdriver/

@josegonzalez
josegonzalezforce-pushed the iframe-sandbox-support branch 4 times, most recently from 5dbb6af to 6d9660cCompareJanuary 16, 2020 19:45
@josegonzalez

Copy link
Copy Markdown
ContributorAuthor

@alexcjohnson once tests pass (I rebased everything together, they previously passed) this should be good for a re-review/merge :)

document.cookie =
`${constants.OAUTH_COOKIE_NAME}=; ` +
'expires=Thu, 01 Jan 1970 00:00:01 GMT;';
} catch (e) {}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Between an eslint exception allowing error swallowing and an eslint exception for a console.warn entry, I'd rather have the warning. Dash will be operating with limited capabilities and the information should be exposed. Maybe later we can approve it with #1088

Comment threaddash-renderer/src/actions/index.js

dash_duo.driver.get("data:text/html;charset=utf-8," + html_content)

assert not dash_duo.get_logs()

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@josegonzalez I suppose that test failure was predictable.. we now log a warning.. and the test picks it up! You'll want to update assert not dash_duo.get_logs() accordingly

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, the other failures i was talking about previously were eslint errors, but i got them covered.

Comment threadrelease Outdated
When dash is embedded into an iframe with a sandbox attribute that only has allow-scripts, cookie access is disabled and dash fails to load. As such, we need to restrict our cookie usage by disabling functionality.
This patch removes the disabled functionality in a graceful manner, allowing dash to load in very restricted iframes.

dash_duo.driver.get("data:text/html;charset=utf-8," + html_content)

assert len(dash_duo.get_logs()) == 2

@Marc-Andre-RivetMarc-Andre-RivetJan 24, 2020

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@josegonzalez The ==2 part is brittle but ok for now I think -- if you could open an issue to improve this part of the test later, I'm fine as-is. What I would like so see here is some validation that the Dash app actually loaded and works as expected. Maybe select the #btn, click it, and make sure at least one of the divs got updated by the callback.

@Marc-Andre-RivetMarc-Andre-Rivet left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💃

@Marc-Andre-Rivet
Marc-Andre-Rivet merged commit ca58cc4 into devJan 29, 2020
@Marc-Andre-Rivet
Marc-Andre-Rivet deleted the iframe-sandbox-support branch January 29, 2020 21:03
nightsailer added a commit to o3cloud/dash that referenced this pull request Feb 23, 2020
* Add standard dash interface for location change (plotly#1094)
* feat: disable cookie access under restricted sandboxes (plotly#1080)
* IE11 compatibility (plotly#1106)
* Add `inheritAsyncDecorator` for wrapper components (plotly#1109)
* bump version, loosen version requirements
* dcc>=1.7.0, 1.7.1 was JS only
* stricten versions
* stricten table version
Co-authored-by: Marc-André Rivet <Marc-Andre-Rivet@users.noreply.github.com>
Co-authored-by: Jose Diaz-Gonzalez <email@josediazgonzalez.com>
nightsailer added a commit to o3cloud/dash that referenced this pull request Feb 23, 2020
* Add standard dash interface for location change (plotly#1094)
* feat: disable cookie access under restricted sandboxes (plotly#1080)
* IE11 compatibility (plotly#1106)
* Add `inheritAsyncDecorator` for wrapper components (plotly#1109)
* bump version, loosen version requirements
* dcc>=1.7.0, 1.7.1 was JS only
* stricten versions
* stricten table version
Co-authored-by: Marc-André Rivet <Marc-Andre-Rivet@users.noreply.github.com>
Co-authored-by: Jose Diaz-Gonzalez <email@josediazgonzalez.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@josegonzalez@alexcjohnson@Marc-Andre-Rivet
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

feat: disable cookie access under restricted sandboxes - #1080

Merged
Marc-Andre-Rivet merged 9 commits into
devfrom
iframe-sandbox-support
Jan 29, 2020
Merged

feat: disable cookie access under restricted sandboxes#1080
Marc-Andre-Rivet merged 9 commits into
devfrom
iframe-sandbox-support

Conversation

@josegonzalez

@josegonzalezjosegonzalez commented Jan 11, 2020

Copy link
Copy Markdown
Contributor

When dash is embedded into an iframe with a sandbox attribute that only has allow-scripts, cookie access is disabled and dash fails to load. As such, we need to restrict our cookie usage by disabling functionality.

This patch removes the disabled functionality in a graceful manner, allowing dash to load in very restricted iframes.

Contributor Checklist

  • I have broken down my PR scope into the following TODO tasks not needed
  • I have run the tests locally and they passed. (refer to testing section in contributing)
  • I have added tests, or extended existing tests, to cover any new features or bugs fixed in this PR

optionals

  • I have added entry in the CHANGELOG.md

@josegonzalez

Copy link
Copy Markdown
ContributorAuthor

Not sure how to fix the Empty block statement error...

@alexcjohnson

Copy link
Copy Markdown
Collaborator

Not sure how to fix the Empty block statement error...

May be worth console.log-ing the error anyway, could be useful to sandbox users for debugging. That would fill the block :)

@josegonzalez

Copy link
Copy Markdown
ContributorAuthor

heh:

Unexpected console statement no-console

@josegonzalez

Copy link
Copy Markdown
ContributorAuthor

@alexcjohnson I've ignored the prettier issue in code for now since there isn't a great way to handle it otherwise.

Do you have any thoughts on how I should write a test for the code? The change itself was manually tested and confirmed working within a large-ish dash app, so I'm fairly confident it works, but I'm not sure how to write tests for the change...

@alexcjohnson

Copy link
Copy Markdown
Collaborator

how I should write a test for the code?

The most robust thing I can think of is to make a container html file (in an assets/ folder next to the test file so dash will serve it) with the actual dash app in a sandboxed iframe - then go interact with the app in the iframe - I've never done that but it looks manageable http://allselenium.info/handling-iframes-using-selenium-webdriver/

@josegonzalez
josegonzalezforce-pushed the iframe-sandbox-support branch 4 times, most recently from 5dbb6af to 6d9660cCompareJanuary 16, 2020 19:45
@josegonzalez

Copy link
Copy Markdown
ContributorAuthor

@alexcjohnson once tests pass (I rebased everything together, they previously passed) this should be good for a re-review/merge :)

document.cookie =
`${constants.OAUTH_COOKIE_NAME}=; ` +
'expires=Thu, 01 Jan 1970 00:00:01 GMT;';
} catch (e) {}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Between an eslint exception allowing error swallowing and an eslint exception for a console.warn entry, I'd rather have the warning. Dash will be operating with limited capabilities and the information should be exposed. Maybe later we can approve it with #1088

Comment threaddash-renderer/src/actions/index.js

dash_duo.driver.get("data:text/html;charset=utf-8," + html_content)

assert not dash_duo.get_logs()

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@josegonzalez I suppose that test failure was predictable.. we now log a warning.. and the test picks it up! You'll want to update assert not dash_duo.get_logs() accordingly

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, the other failures i was talking about previously were eslint errors, but i got them covered.

Comment threadrelease Outdated
When dash is embedded into an iframe with a sandbox attribute that only has allow-scripts, cookie access is disabled and dash fails to load. As such, we need to restrict our cookie usage by disabling functionality.
This patch removes the disabled functionality in a graceful manner, allowing dash to load in very restricted iframes.

dash_duo.driver.get("data:text/html;charset=utf-8," + html_content)

assert len(dash_duo.get_logs()) == 2

@Marc-Andre-RivetMarc-Andre-RivetJan 24, 2020

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@josegonzalez The ==2 part is brittle but ok for now I think -- if you could open an issue to improve this part of the test later, I'm fine as-is. What I would like so see here is some validation that the Dash app actually loaded and works as expected. Maybe select the #btn, click it, and make sure at least one of the divs got updated by the callback.

@Marc-Andre-RivetMarc-Andre-Rivet left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💃

@Marc-Andre-Rivet
Marc-Andre-Rivet merged commit ca58cc4 into devJan 29, 2020
@Marc-Andre-Rivet
Marc-Andre-Rivet deleted the iframe-sandbox-support branch January 29, 2020 21:03
nightsailer added a commit to o3cloud/dash that referenced this pull request Feb 23, 2020
* Add standard dash interface for location change (plotly#1094)
* feat: disable cookie access under restricted sandboxes (plotly#1080)
* IE11 compatibility (plotly#1106)
* Add `inheritAsyncDecorator` for wrapper components (plotly#1109)
* bump version, loosen version requirements
* dcc>=1.7.0, 1.7.1 was JS only
* stricten versions
* stricten table version
Co-authored-by: Marc-André Rivet <Marc-Andre-Rivet@users.noreply.github.com>
Co-authored-by: Jose Diaz-Gonzalez <email@josediazgonzalez.com>
nightsailer added a commit to o3cloud/dash that referenced this pull request Feb 23, 2020
* Add standard dash interface for location change (plotly#1094)
* feat: disable cookie access under restricted sandboxes (plotly#1080)
* IE11 compatibility (plotly#1106)
* Add `inheritAsyncDecorator` for wrapper components (plotly#1109)
* bump version, loosen version requirements
* dcc>=1.7.0, 1.7.1 was JS only
* stricten versions
* stricten table version
Co-authored-by: Marc-André Rivet <Marc-Andre-Rivet@users.noreply.github.com>
Co-authored-by: Jose Diaz-Gonzalez <email@josediazgonzalez.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@josegonzalez@alexcjohnson@Marc-Andre-Rivet
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: disable cookie access under restricted sandboxes - #1080

Merged
Marc-Andre-Rivet merged 9 commits into
devfrom
iframe-sandbox-support
Jan 29, 2020
Merged

feat: disable cookie access under restricted sandboxes#1080
Marc-Andre-Rivet merged 9 commits into
devfrom
iframe-sandbox-support

Conversation

@josegonzalez

@josegonzalezjosegonzalez commented Jan 11, 2020

Copy link
Copy Markdown
Contributor

When dash is embedded into an iframe with a sandbox attribute that only has allow-scripts, cookie access is disabled and dash fails to load. As such, we need to restrict our cookie usage by disabling functionality.

This patch removes the disabled functionality in a graceful manner, allowing dash to load in very restricted iframes.

Contributor Checklist

  • I have broken down my PR scope into the following TODO tasks not needed
  • I have run the tests locally and they passed. (refer to testing section in contributing)
  • I have added tests, or extended existing tests, to cover any new features or bugs fixed in this PR

optionals

  • I have added entry in the CHANGELOG.md

@josegonzalez

Copy link
Copy Markdown
ContributorAuthor

Not sure how to fix the Empty block statement error...

@alexcjohnson

Copy link
Copy Markdown
Collaborator

Not sure how to fix the Empty block statement error...

May be worth console.log-ing the error anyway, could be useful to sandbox users for debugging. That would fill the block :)

@josegonzalez

Copy link
Copy Markdown
ContributorAuthor

heh:

Unexpected console statement no-console

@josegonzalez

Copy link
Copy Markdown
ContributorAuthor

@alexcjohnson I've ignored the prettier issue in code for now since there isn't a great way to handle it otherwise.

Do you have any thoughts on how I should write a test for the code? The change itself was manually tested and confirmed working within a large-ish dash app, so I'm fairly confident it works, but I'm not sure how to write tests for the change...

@alexcjohnson

Copy link
Copy Markdown
Collaborator

how I should write a test for the code?

The most robust thing I can think of is to make a container html file (in an assets/ folder next to the test file so dash will serve it) with the actual dash app in a sandboxed iframe - then go interact with the app in the iframe - I've never done that but it looks manageable http://allselenium.info/handling-iframes-using-selenium-webdriver/

@josegonzalez
josegonzalezforce-pushed the iframe-sandbox-support branch 4 times, most recently from 5dbb6af to 6d9660cCompareJanuary 16, 2020 19:45
@josegonzalez

Copy link
Copy Markdown
ContributorAuthor

@alexcjohnson once tests pass (I rebased everything together, they previously passed) this should be good for a re-review/merge :)

document.cookie =
`${constants.OAUTH_COOKIE_NAME}=; ` +
'expires=Thu, 01 Jan 1970 00:00:01 GMT;';
} catch (e) {}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Between an eslint exception allowing error swallowing and an eslint exception for a console.warn entry, I'd rather have the warning. Dash will be operating with limited capabilities and the information should be exposed. Maybe later we can approve it with #1088

Comment threaddash-renderer/src/actions/index.js

dash_duo.driver.get("data:text/html;charset=utf-8," + html_content)

assert not dash_duo.get_logs()

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@josegonzalez I suppose that test failure was predictable.. we now log a warning.. and the test picks it up! You'll want to update assert not dash_duo.get_logs() accordingly

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, the other failures i was talking about previously were eslint errors, but i got them covered.

Comment threadrelease Outdated
When dash is embedded into an iframe with a sandbox attribute that only has allow-scripts, cookie access is disabled and dash fails to load. As such, we need to restrict our cookie usage by disabling functionality.
This patch removes the disabled functionality in a graceful manner, allowing dash to load in very restricted iframes.

dash_duo.driver.get("data:text/html;charset=utf-8," + html_content)

assert len(dash_duo.get_logs()) == 2

@Marc-Andre-RivetMarc-Andre-RivetJan 24, 2020

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@josegonzalez The ==2 part is brittle but ok for now I think -- if you could open an issue to improve this part of the test later, I'm fine as-is. What I would like so see here is some validation that the Dash app actually loaded and works as expected. Maybe select the #btn, click it, and make sure at least one of the divs got updated by the callback.

@Marc-Andre-RivetMarc-Andre-Rivet left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💃

@Marc-Andre-Rivet
Marc-Andre-Rivet merged commit ca58cc4 into devJan 29, 2020
@Marc-Andre-Rivet
Marc-Andre-Rivet deleted the iframe-sandbox-support branch January 29, 2020 21:03
nightsailer added a commit to o3cloud/dash that referenced this pull request Feb 23, 2020
* Add standard dash interface for location change (plotly#1094)
* feat: disable cookie access under restricted sandboxes (plotly#1080)
* IE11 compatibility (plotly#1106)
* Add `inheritAsyncDecorator` for wrapper components (plotly#1109)
* bump version, loosen version requirements
* dcc>=1.7.0, 1.7.1 was JS only
* stricten versions
* stricten table version
Co-authored-by: Marc-André Rivet <Marc-Andre-Rivet@users.noreply.github.com>
Co-authored-by: Jose Diaz-Gonzalez <email@josediazgonzalez.com>
nightsailer added a commit to o3cloud/dash that referenced this pull request Feb 23, 2020
* Add standard dash interface for location change (plotly#1094)
* feat: disable cookie access under restricted sandboxes (plotly#1080)
* IE11 compatibility (plotly#1106)
* Add `inheritAsyncDecorator` for wrapper components (plotly#1109)
* bump version, loosen version requirements
* dcc>=1.7.0, 1.7.1 was JS only
* stricten versions
* stricten table version
Co-authored-by: Marc-André Rivet <Marc-Andre-Rivet@users.noreply.github.com>
Co-authored-by: Jose Diaz-Gonzalez <email@josediazgonzalez.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@josegonzalez@alexcjohnson@Marc-Andre-Rivet
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: disable cookie access under restricted sandboxes - #1080

Merged
Marc-Andre-Rivet merged 9 commits into
devfrom
iframe-sandbox-support
Jan 29, 2020
Merged

feat: disable cookie access under restricted sandboxes#1080
Marc-Andre-Rivet merged 9 commits into
devfrom
iframe-sandbox-support

Conversation

@josegonzalez

@josegonzalezjosegonzalez commented Jan 11, 2020

Copy link
Copy Markdown
Contributor

When dash is embedded into an iframe with a sandbox attribute that only has allow-scripts, cookie access is disabled and dash fails to load. As such, we need to restrict our cookie usage by disabling functionality.

This patch removes the disabled functionality in a graceful manner, allowing dash to load in very restricted iframes.

Contributor Checklist

  • I have broken down my PR scope into the following TODO tasks not needed
  • I have run the tests locally and they passed. (refer to testing section in contributing)
  • I have added tests, or extended existing tests, to cover any new features or bugs fixed in this PR

optionals

  • I have added entry in the CHANGELOG.md

@josegonzalez

Copy link
Copy Markdown
ContributorAuthor

Not sure how to fix the Empty block statement error...

@alexcjohnson

Copy link
Copy Markdown
Collaborator

Not sure how to fix the Empty block statement error...

May be worth console.log-ing the error anyway, could be useful to sandbox users for debugging. That would fill the block :)

@josegonzalez

Copy link
Copy Markdown
ContributorAuthor

heh:

Unexpected console statement no-console

@josegonzalez

Copy link
Copy Markdown
ContributorAuthor

@alexcjohnson I've ignored the prettier issue in code for now since there isn't a great way to handle it otherwise.

Do you have any thoughts on how I should write a test for the code? The change itself was manually tested and confirmed working within a large-ish dash app, so I'm fairly confident it works, but I'm not sure how to write tests for the change...

@alexcjohnson

Copy link
Copy Markdown
Collaborator

how I should write a test for the code?

The most robust thing I can think of is to make a container html file (in an assets/ folder next to the test file so dash will serve it) with the actual dash app in a sandboxed iframe - then go interact with the app in the iframe - I've never done that but it looks manageable http://allselenium.info/handling-iframes-using-selenium-webdriver/

@josegonzalez
josegonzalezforce-pushed the iframe-sandbox-support branch 4 times, most recently from 5dbb6af to 6d9660cCompareJanuary 16, 2020 19:45
@josegonzalez

Copy link
Copy Markdown
ContributorAuthor

@alexcjohnson once tests pass (I rebased everything together, they previously passed) this should be good for a re-review/merge :)

document.cookie =
`${constants.OAUTH_COOKIE_NAME}=; ` +
'expires=Thu, 01 Jan 1970 00:00:01 GMT;';
} catch (e) {}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Between an eslint exception allowing error swallowing and an eslint exception for a console.warn entry, I'd rather have the warning. Dash will be operating with limited capabilities and the information should be exposed. Maybe later we can approve it with #1088

Comment threaddash-renderer/src/actions/index.js

dash_duo.driver.get("data:text/html;charset=utf-8," + html_content)

assert not dash_duo.get_logs()

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@josegonzalez I suppose that test failure was predictable.. we now log a warning.. and the test picks it up! You'll want to update assert not dash_duo.get_logs() accordingly

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, the other failures i was talking about previously were eslint errors, but i got them covered.

Comment threadrelease Outdated
When dash is embedded into an iframe with a sandbox attribute that only has allow-scripts, cookie access is disabled and dash fails to load. As such, we need to restrict our cookie usage by disabling functionality.
This patch removes the disabled functionality in a graceful manner, allowing dash to load in very restricted iframes.

dash_duo.driver.get("data:text/html;charset=utf-8," + html_content)

assert len(dash_duo.get_logs()) == 2

@Marc-Andre-RivetMarc-Andre-RivetJan 24, 2020

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@josegonzalez The ==2 part is brittle but ok for now I think -- if you could open an issue to improve this part of the test later, I'm fine as-is. What I would like so see here is some validation that the Dash app actually loaded and works as expected. Maybe select the #btn, click it, and make sure at least one of the divs got updated by the callback.

@Marc-Andre-RivetMarc-Andre-Rivet left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💃

@Marc-Andre-Rivet
Marc-Andre-Rivet merged commit ca58cc4 into devJan 29, 2020
@Marc-Andre-Rivet
Marc-Andre-Rivet deleted the iframe-sandbox-support branch January 29, 2020 21:03
nightsailer added a commit to o3cloud/dash that referenced this pull request Feb 23, 2020
* Add standard dash interface for location change (plotly#1094)
* feat: disable cookie access under restricted sandboxes (plotly#1080)
* IE11 compatibility (plotly#1106)
* Add `inheritAsyncDecorator` for wrapper components (plotly#1109)
* bump version, loosen version requirements
* dcc>=1.7.0, 1.7.1 was JS only
* stricten versions
* stricten table version
Co-authored-by: Marc-André Rivet <Marc-Andre-Rivet@users.noreply.github.com>
Co-authored-by: Jose Diaz-Gonzalez <email@josediazgonzalez.com>
nightsailer added a commit to o3cloud/dash that referenced this pull request Feb 23, 2020
* Add standard dash interface for location change (plotly#1094)
* feat: disable cookie access under restricted sandboxes (plotly#1080)
* IE11 compatibility (plotly#1106)
* Add `inheritAsyncDecorator` for wrapper components (plotly#1109)
* bump version, loosen version requirements
* dcc>=1.7.0, 1.7.1 was JS only
* stricten versions
* stricten table version
Co-authored-by: Marc-André Rivet <Marc-Andre-Rivet@users.noreply.github.com>
Co-authored-by: Jose Diaz-Gonzalez <email@josediazgonzalez.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@josegonzalez@alexcjohnson@Marc-Andre-Rivet
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

feat: disable cookie access under restricted sandboxes - #1080

Merged
Marc-Andre-Rivet merged 9 commits into
devfrom
iframe-sandbox-support
Jan 29, 2020
Merged

feat: disable cookie access under restricted sandboxes#1080
Marc-Andre-Rivet merged 9 commits into
devfrom
iframe-sandbox-support

Conversation

@josegonzalez

@josegonzalezjosegonzalez commented Jan 11, 2020

Copy link
Copy Markdown
Contributor

When dash is embedded into an iframe with a sandbox attribute that only has allow-scripts, cookie access is disabled and dash fails to load. As such, we need to restrict our cookie usage by disabling functionality.

This patch removes the disabled functionality in a graceful manner, allowing dash to load in very restricted iframes.

Contributor Checklist

  • I have broken down my PR scope into the following TODO tasks not needed
  • I have run the tests locally and they passed. (refer to testing section in contributing)
  • I have added tests, or extended existing tests, to cover any new features or bugs fixed in this PR

optionals

  • I have added entry in the CHANGELOG.md

@josegonzalez

Copy link
Copy Markdown
ContributorAuthor

Not sure how to fix the Empty block statement error...

@alexcjohnson

Copy link
Copy Markdown
Collaborator

Not sure how to fix the Empty block statement error...

May be worth console.log-ing the error anyway, could be useful to sandbox users for debugging. That would fill the block :)

@josegonzalez

Copy link
Copy Markdown
ContributorAuthor

heh:

Unexpected console statement no-console

@josegonzalez

Copy link
Copy Markdown
ContributorAuthor

@alexcjohnson I've ignored the prettier issue in code for now since there isn't a great way to handle it otherwise.

Do you have any thoughts on how I should write a test for the code? The change itself was manually tested and confirmed working within a large-ish dash app, so I'm fairly confident it works, but I'm not sure how to write tests for the change...

@alexcjohnson

Copy link
Copy Markdown
Collaborator

how I should write a test for the code?

The most robust thing I can think of is to make a container html file (in an assets/ folder next to the test file so dash will serve it) with the actual dash app in a sandboxed iframe - then go interact with the app in the iframe - I've never done that but it looks manageable http://allselenium.info/handling-iframes-using-selenium-webdriver/

@josegonzalez
josegonzalezforce-pushed the iframe-sandbox-support branch 4 times, most recently from 5dbb6af to 6d9660cCompareJanuary 16, 2020 19:45
@josegonzalez

Copy link
Copy Markdown
ContributorAuthor

@alexcjohnson once tests pass (I rebased everything together, they previously passed) this should be good for a re-review/merge :)

document.cookie =
`${constants.OAUTH_COOKIE_NAME}=; ` +
'expires=Thu, 01 Jan 1970 00:00:01 GMT;';
} catch (e) {}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Between an eslint exception allowing error swallowing and an eslint exception for a console.warn entry, I'd rather have the warning. Dash will be operating with limited capabilities and the information should be exposed. Maybe later we can approve it with #1088

Comment threaddash-renderer/src/actions/index.js

dash_duo.driver.get("data:text/html;charset=utf-8," + html_content)

assert not dash_duo.get_logs()

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@josegonzalez I suppose that test failure was predictable.. we now log a warning.. and the test picks it up! You'll want to update assert not dash_duo.get_logs() accordingly

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, the other failures i was talking about previously were eslint errors, but i got them covered.

Comment threadrelease Outdated
When dash is embedded into an iframe with a sandbox attribute that only has allow-scripts, cookie access is disabled and dash fails to load. As such, we need to restrict our cookie usage by disabling functionality.
This patch removes the disabled functionality in a graceful manner, allowing dash to load in very restricted iframes.

dash_duo.driver.get("data:text/html;charset=utf-8," + html_content)

assert len(dash_duo.get_logs()) == 2

@Marc-Andre-RivetMarc-Andre-RivetJan 24, 2020

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@josegonzalez The ==2 part is brittle but ok for now I think -- if you could open an issue to improve this part of the test later, I'm fine as-is. What I would like so see here is some validation that the Dash app actually loaded and works as expected. Maybe select the #btn, click it, and make sure at least one of the divs got updated by the callback.

@Marc-Andre-RivetMarc-Andre-Rivet left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💃

@Marc-Andre-Rivet
Marc-Andre-Rivet merged commit ca58cc4 into devJan 29, 2020
@Marc-Andre-Rivet
Marc-Andre-Rivet deleted the iframe-sandbox-support branch January 29, 2020 21:03
nightsailer added a commit to o3cloud/dash that referenced this pull request Feb 23, 2020
* Add standard dash interface for location change (plotly#1094)
* feat: disable cookie access under restricted sandboxes (plotly#1080)
* IE11 compatibility (plotly#1106)
* Add `inheritAsyncDecorator` for wrapper components (plotly#1109)
* bump version, loosen version requirements
* dcc>=1.7.0, 1.7.1 was JS only
* stricten versions
* stricten table version
Co-authored-by: Marc-André Rivet <Marc-Andre-Rivet@users.noreply.github.com>
Co-authored-by: Jose Diaz-Gonzalez <email@josediazgonzalez.com>
nightsailer added a commit to o3cloud/dash that referenced this pull request Feb 23, 2020
* Add standard dash interface for location change (plotly#1094)
* feat: disable cookie access under restricted sandboxes (plotly#1080)
* IE11 compatibility (plotly#1106)
* Add `inheritAsyncDecorator` for wrapper components (plotly#1109)
* bump version, loosen version requirements
* dcc>=1.7.0, 1.7.1 was JS only
* stricten versions
* stricten table version
Co-authored-by: Marc-André Rivet <Marc-Andre-Rivet@users.noreply.github.com>
Co-authored-by: Jose Diaz-Gonzalez <email@josediazgonzalez.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@josegonzalez@alexcjohnson@Marc-Andre-Rivet