[6.x] Update authorization / permissions - #11516

Merged
jasonvarga merged 29 commits into
masterfrom
super-user-authorization
Mar 13, 2025
Merged

[6.x] Update authorization / permissions#11516
jasonvarga merged 29 commits into
masterfrom
super-user-authorization

Conversation

@duncanmcclean

@duncanmccleanduncanmcclean commented Feb 28, 2025

Copy link
Copy Markdown
Member

This pull request:

  • Only applies our auth logic to Statamic permissions, which prevents us from interfering with custom auth gates.
  • Moves our auth logic from Gate::before to after, enabling users to more easily deny access to things.
  • Adds super user checks to before in most Statamic policies to continue to avoid overhead when users are super.

Closes#8337.
Closes#10832.

Otherwise, when the `Authorize` middleware checks if the user has access to the CP, `Permission:all()` in the `Gate::before()` closure won't return any permissions as they haven't been booted yet.
Until I figure out a better solution. 🤔
Since there's no `DroidsClass` policy, I've updated this test to authorize using a permission instead, which'll work.
Comment threadsrc/Providers/AuthServiceProvider.php Outdated
@duncanmcclean
duncanmcclean marked this pull request as ready for review March 6, 2025 15:25
Comment threadsrc/Providers/AuthServiceProvider.php Outdated
@duncanmcclean
duncanmccleanforce-pushed the super-user-authorization branch from 1136551 to 88e702fCompareMarch 7, 2025 12:46
Since more stuff gets evaluated now (all the permissions are compiled) all the sites will be looped over. Many tests were setting up sites without explicit names. They don't really need them so here the site name will fall back to the handle.
@jasonvarga

Copy link
Copy Markdown
Member

Since we're checking whether an ability is a Statamic one, I had to add a way to get all the resolved permissions. The Permission::all() you had there wouldn't work since it would include placeholders. e.g. edit {collection} entries. The ability passed would be edit blog entries. Permission::flattened() will now resolve all of them.

@jasonvargajasonvarga changed the title [6.x] Re-work super user authorization check[6.x] Update authorization / permissionsMar 13, 2025
@jasonvarga
jasonvarga merged commit a8726dd into masterMar 13, 2025
@jasonvarga
jasonvarga deleted the super-user-authorization branch March 13, 2025 15:23
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.

2 participants

@duncanmcclean@jasonvarga
, '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

[6.x] Update authorization / permissions - #11516

Merged
jasonvarga merged 29 commits into
masterfrom
super-user-authorization
Mar 13, 2025
Merged

[6.x] Update authorization / permissions#11516
jasonvarga merged 29 commits into
masterfrom
super-user-authorization

Conversation

@duncanmcclean

@duncanmccleanduncanmcclean commented Feb 28, 2025

Copy link
Copy Markdown
Member

This pull request:

  • Only applies our auth logic to Statamic permissions, which prevents us from interfering with custom auth gates.
  • Moves our auth logic from Gate::before to after, enabling users to more easily deny access to things.
  • Adds super user checks to before in most Statamic policies to continue to avoid overhead when users are super.

Closes#8337.
Closes#10832.

Otherwise, when the `Authorize` middleware checks if the user has access to the CP, `Permission:all()` in the `Gate::before()` closure won't return any permissions as they haven't been booted yet.
Until I figure out a better solution. 🤔
Since there's no `DroidsClass` policy, I've updated this test to authorize using a permission instead, which'll work.
Comment threadsrc/Providers/AuthServiceProvider.php Outdated
@duncanmcclean
duncanmcclean marked this pull request as ready for review March 6, 2025 15:25
Comment threadsrc/Providers/AuthServiceProvider.php Outdated
@duncanmcclean
duncanmccleanforce-pushed the super-user-authorization branch from 1136551 to 88e702fCompareMarch 7, 2025 12:46
Since more stuff gets evaluated now (all the permissions are compiled) all the sites will be looped over. Many tests were setting up sites without explicit names. They don't really need them so here the site name will fall back to the handle.
@jasonvarga

Copy link
Copy Markdown
Member

Since we're checking whether an ability is a Statamic one, I had to add a way to get all the resolved permissions. The Permission::all() you had there wouldn't work since it would include placeholders. e.g. edit {collection} entries. The ability passed would be edit blog entries. Permission::flattened() will now resolve all of them.

@jasonvargajasonvarga changed the title [6.x] Re-work super user authorization check[6.x] Update authorization / permissionsMar 13, 2025
@jasonvarga
jasonvarga merged commit a8726dd into masterMar 13, 2025
@jasonvarga
jasonvarga deleted the super-user-authorization branch March 13, 2025 15:23
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.

2 participants

@duncanmcclean@jasonvarga
, '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

[6.x] Update authorization / permissions - #11516

Merged
jasonvarga merged 29 commits into
masterfrom
super-user-authorization
Mar 13, 2025
Merged

[6.x] Update authorization / permissions#11516
jasonvarga merged 29 commits into
masterfrom
super-user-authorization

Conversation

@duncanmcclean

@duncanmccleanduncanmcclean commented Feb 28, 2025

Copy link
Copy Markdown
Member

This pull request:

  • Only applies our auth logic to Statamic permissions, which prevents us from interfering with custom auth gates.
  • Moves our auth logic from Gate::before to after, enabling users to more easily deny access to things.
  • Adds super user checks to before in most Statamic policies to continue to avoid overhead when users are super.

Closes#8337.
Closes#10832.

Otherwise, when the `Authorize` middleware checks if the user has access to the CP, `Permission:all()` in the `Gate::before()` closure won't return any permissions as they haven't been booted yet.
Until I figure out a better solution. 🤔
Since there's no `DroidsClass` policy, I've updated this test to authorize using a permission instead, which'll work.
Comment threadsrc/Providers/AuthServiceProvider.php Outdated
@duncanmcclean
duncanmcclean marked this pull request as ready for review March 6, 2025 15:25
Comment threadsrc/Providers/AuthServiceProvider.php Outdated
@duncanmcclean
duncanmccleanforce-pushed the super-user-authorization branch from 1136551 to 88e702fCompareMarch 7, 2025 12:46
Since more stuff gets evaluated now (all the permissions are compiled) all the sites will be looped over. Many tests were setting up sites without explicit names. They don't really need them so here the site name will fall back to the handle.
@jasonvarga

Copy link
Copy Markdown
Member

Since we're checking whether an ability is a Statamic one, I had to add a way to get all the resolved permissions. The Permission::all() you had there wouldn't work since it would include placeholders. e.g. edit {collection} entries. The ability passed would be edit blog entries. Permission::flattened() will now resolve all of them.

@jasonvargajasonvarga changed the title [6.x] Re-work super user authorization check[6.x] Update authorization / permissionsMar 13, 2025
@jasonvarga
jasonvarga merged commit a8726dd into masterMar 13, 2025
@jasonvarga
jasonvarga deleted the super-user-authorization branch March 13, 2025 15:23
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.

2 participants

@duncanmcclean@jasonvarga
, '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

[6.x] Update authorization / permissions - #11516

Merged
jasonvarga merged 29 commits into
masterfrom
super-user-authorization
Mar 13, 2025
Merged

[6.x] Update authorization / permissions#11516
jasonvarga merged 29 commits into
masterfrom
super-user-authorization

Conversation

@duncanmcclean

@duncanmccleanduncanmcclean commented Feb 28, 2025

Copy link
Copy Markdown
Member

This pull request:

  • Only applies our auth logic to Statamic permissions, which prevents us from interfering with custom auth gates.
  • Moves our auth logic from Gate::before to after, enabling users to more easily deny access to things.
  • Adds super user checks to before in most Statamic policies to continue to avoid overhead when users are super.

Closes#8337.
Closes#10832.

Otherwise, when the `Authorize` middleware checks if the user has access to the CP, `Permission:all()` in the `Gate::before()` closure won't return any permissions as they haven't been booted yet.
Until I figure out a better solution. 🤔
Since there's no `DroidsClass` policy, I've updated this test to authorize using a permission instead, which'll work.
Comment threadsrc/Providers/AuthServiceProvider.php Outdated
@duncanmcclean
duncanmcclean marked this pull request as ready for review March 6, 2025 15:25
Comment threadsrc/Providers/AuthServiceProvider.php Outdated
@duncanmcclean
duncanmccleanforce-pushed the super-user-authorization branch from 1136551 to 88e702fCompareMarch 7, 2025 12:46
Since more stuff gets evaluated now (all the permissions are compiled) all the sites will be looped over. Many tests were setting up sites without explicit names. They don't really need them so here the site name will fall back to the handle.
@jasonvarga

Copy link
Copy Markdown
Member

Since we're checking whether an ability is a Statamic one, I had to add a way to get all the resolved permissions. The Permission::all() you had there wouldn't work since it would include placeholders. e.g. edit {collection} entries. The ability passed would be edit blog entries. Permission::flattened() will now resolve all of them.

@jasonvargajasonvarga changed the title [6.x] Re-work super user authorization check[6.x] Update authorization / permissionsMar 13, 2025
@jasonvarga
jasonvarga merged commit a8726dd into masterMar 13, 2025
@jasonvarga
jasonvarga deleted the super-user-authorization branch March 13, 2025 15:23
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.

2 participants

@duncanmcclean@jasonvarga
, '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

[6.x] Update authorization / permissions - #11516

Merged
jasonvarga merged 29 commits into
masterfrom
super-user-authorization
Mar 13, 2025
Merged

[6.x] Update authorization / permissions#11516
jasonvarga merged 29 commits into
masterfrom
super-user-authorization

Conversation

@duncanmcclean

@duncanmccleanduncanmcclean commented Feb 28, 2025

Copy link
Copy Markdown
Member

This pull request:

  • Only applies our auth logic to Statamic permissions, which prevents us from interfering with custom auth gates.
  • Moves our auth logic from Gate::before to after, enabling users to more easily deny access to things.
  • Adds super user checks to before in most Statamic policies to continue to avoid overhead when users are super.

Closes#8337.
Closes#10832.

Otherwise, when the `Authorize` middleware checks if the user has access to the CP, `Permission:all()` in the `Gate::before()` closure won't return any permissions as they haven't been booted yet.
Until I figure out a better solution. 🤔
Since there's no `DroidsClass` policy, I've updated this test to authorize using a permission instead, which'll work.
Comment threadsrc/Providers/AuthServiceProvider.php Outdated
@duncanmcclean
duncanmcclean marked this pull request as ready for review March 6, 2025 15:25
Comment threadsrc/Providers/AuthServiceProvider.php Outdated
@duncanmcclean
duncanmccleanforce-pushed the super-user-authorization branch from 1136551 to 88e702fCompareMarch 7, 2025 12:46
Since more stuff gets evaluated now (all the permissions are compiled) all the sites will be looped over. Many tests were setting up sites without explicit names. They don't really need them so here the site name will fall back to the handle.
@jasonvarga

Copy link
Copy Markdown
Member

Since we're checking whether an ability is a Statamic one, I had to add a way to get all the resolved permissions. The Permission::all() you had there wouldn't work since it would include placeholders. e.g. edit {collection} entries. The ability passed would be edit blog entries. Permission::flattened() will now resolve all of them.

@jasonvargajasonvarga changed the title [6.x] Re-work super user authorization check[6.x] Update authorization / permissionsMar 13, 2025
@jasonvarga
jasonvarga merged commit a8726dd into masterMar 13, 2025
@jasonvarga
jasonvarga deleted the super-user-authorization branch March 13, 2025 15:23
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.

2 participants

@duncanmcclean@jasonvarga
, '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

[6.x] Update authorization / permissions - #11516

Merged
jasonvarga merged 29 commits into
masterfrom
super-user-authorization
Mar 13, 2025
Merged

[6.x] Update authorization / permissions#11516
jasonvarga merged 29 commits into
masterfrom
super-user-authorization

Conversation

@duncanmcclean

@duncanmccleanduncanmcclean commented Feb 28, 2025

Copy link
Copy Markdown
Member

This pull request:

  • Only applies our auth logic to Statamic permissions, which prevents us from interfering with custom auth gates.
  • Moves our auth logic from Gate::before to after, enabling users to more easily deny access to things.
  • Adds super user checks to before in most Statamic policies to continue to avoid overhead when users are super.

Closes#8337.
Closes#10832.

Otherwise, when the `Authorize` middleware checks if the user has access to the CP, `Permission:all()` in the `Gate::before()` closure won't return any permissions as they haven't been booted yet.
Until I figure out a better solution. 🤔
Since there's no `DroidsClass` policy, I've updated this test to authorize using a permission instead, which'll work.
Comment threadsrc/Providers/AuthServiceProvider.php Outdated
@duncanmcclean
duncanmcclean marked this pull request as ready for review March 6, 2025 15:25
Comment threadsrc/Providers/AuthServiceProvider.php Outdated
@duncanmcclean
duncanmccleanforce-pushed the super-user-authorization branch from 1136551 to 88e702fCompareMarch 7, 2025 12:46
Since more stuff gets evaluated now (all the permissions are compiled) all the sites will be looped over. Many tests were setting up sites without explicit names. They don't really need them so here the site name will fall back to the handle.
@jasonvarga

Copy link
Copy Markdown
Member

Since we're checking whether an ability is a Statamic one, I had to add a way to get all the resolved permissions. The Permission::all() you had there wouldn't work since it would include placeholders. e.g. edit {collection} entries. The ability passed would be edit blog entries. Permission::flattened() will now resolve all of them.

@jasonvargajasonvarga changed the title [6.x] Re-work super user authorization check[6.x] Update authorization / permissionsMar 13, 2025
@jasonvarga
jasonvarga merged commit a8726dd into masterMar 13, 2025
@jasonvarga
jasonvarga deleted the super-user-authorization branch March 13, 2025 15:23
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.

2 participants

@duncanmcclean@jasonvarga
, '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

[6.x] Update authorization / permissions - #11516

Merged
jasonvarga merged 29 commits into
masterfrom
super-user-authorization
Mar 13, 2025
Merged

[6.x] Update authorization / permissions#11516
jasonvarga merged 29 commits into
masterfrom
super-user-authorization

Conversation

@duncanmcclean

@duncanmccleanduncanmcclean commented Feb 28, 2025

Copy link
Copy Markdown
Member

This pull request:

  • Only applies our auth logic to Statamic permissions, which prevents us from interfering with custom auth gates.
  • Moves our auth logic from Gate::before to after, enabling users to more easily deny access to things.
  • Adds super user checks to before in most Statamic policies to continue to avoid overhead when users are super.

Closes#8337.
Closes#10832.

Otherwise, when the `Authorize` middleware checks if the user has access to the CP, `Permission:all()` in the `Gate::before()` closure won't return any permissions as they haven't been booted yet.
Until I figure out a better solution. 🤔
Since there's no `DroidsClass` policy, I've updated this test to authorize using a permission instead, which'll work.
Comment threadsrc/Providers/AuthServiceProvider.php Outdated
@duncanmcclean
duncanmcclean marked this pull request as ready for review March 6, 2025 15:25
Comment threadsrc/Providers/AuthServiceProvider.php Outdated
@duncanmcclean
duncanmccleanforce-pushed the super-user-authorization branch from 1136551 to 88e702fCompareMarch 7, 2025 12:46
Since more stuff gets evaluated now (all the permissions are compiled) all the sites will be looped over. Many tests were setting up sites without explicit names. They don't really need them so here the site name will fall back to the handle.
@jasonvarga

Copy link
Copy Markdown
Member

Since we're checking whether an ability is a Statamic one, I had to add a way to get all the resolved permissions. The Permission::all() you had there wouldn't work since it would include placeholders. e.g. edit {collection} entries. The ability passed would be edit blog entries. Permission::flattened() will now resolve all of them.

@jasonvargajasonvarga changed the title [6.x] Re-work super user authorization check[6.x] Update authorization / permissionsMar 13, 2025
@jasonvarga
jasonvarga merged commit a8726dd into masterMar 13, 2025
@jasonvarga
jasonvarga deleted the super-user-authorization branch March 13, 2025 15:23
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.

2 participants

@duncanmcclean@jasonvarga
, '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

[6.x] Update authorization / permissions - #11516

Merged
jasonvarga merged 29 commits into
masterfrom
super-user-authorization
Mar 13, 2025
Merged

[6.x] Update authorization / permissions#11516
jasonvarga merged 29 commits into
masterfrom
super-user-authorization

Conversation

@duncanmcclean

@duncanmccleanduncanmcclean commented Feb 28, 2025

Copy link
Copy Markdown
Member

This pull request:

  • Only applies our auth logic to Statamic permissions, which prevents us from interfering with custom auth gates.
  • Moves our auth logic from Gate::before to after, enabling users to more easily deny access to things.
  • Adds super user checks to before in most Statamic policies to continue to avoid overhead when users are super.

Closes#8337.
Closes#10832.

Otherwise, when the `Authorize` middleware checks if the user has access to the CP, `Permission:all()` in the `Gate::before()` closure won't return any permissions as they haven't been booted yet.
Until I figure out a better solution. 🤔
Since there's no `DroidsClass` policy, I've updated this test to authorize using a permission instead, which'll work.
Comment threadsrc/Providers/AuthServiceProvider.php Outdated
@duncanmcclean
duncanmcclean marked this pull request as ready for review March 6, 2025 15:25
Comment threadsrc/Providers/AuthServiceProvider.php Outdated
@duncanmcclean
duncanmccleanforce-pushed the super-user-authorization branch from 1136551 to 88e702fCompareMarch 7, 2025 12:46
Since more stuff gets evaluated now (all the permissions are compiled) all the sites will be looped over. Many tests were setting up sites without explicit names. They don't really need them so here the site name will fall back to the handle.
@jasonvarga

Copy link
Copy Markdown
Member

Since we're checking whether an ability is a Statamic one, I had to add a way to get all the resolved permissions. The Permission::all() you had there wouldn't work since it would include placeholders. e.g. edit {collection} entries. The ability passed would be edit blog entries. Permission::flattened() will now resolve all of them.

@jasonvargajasonvarga changed the title [6.x] Re-work super user authorization check[6.x] Update authorization / permissionsMar 13, 2025
@jasonvarga
jasonvarga merged commit a8726dd into masterMar 13, 2025
@jasonvarga
jasonvarga deleted the super-user-authorization branch March 13, 2025 15:23
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.

2 participants

@duncanmcclean@jasonvarga