mirror of
https://github.com/kevinveenbirkenbach/computer-playbook.git
synced 2025-08-15 08:30:46 +02:00
- Added vars/main.yml to define iframe-handler.js file name and destination - Implemented 01_deploy.yml to deploy iframe-handler.js to CDN and set mtime-based version fact - Split original iframe logic into: • iframe-handler.js (full logic, served from CDN) • iframe-init_one_liner.js.j2 (small inline bootstrap, CSP-hashed) - Updated head_sub.j2 to load script from CDN instead of embedding full code - Added body_sub.j2 for inline init code - Updated iframe-handler.js.j2 with initIframeHandler() function and global exposure - Activated role earlier in inj-compose with public: true so vars are available for templates - Included 'port-ui-desktop' in body_snippets loop in location.lua.j2 - Disabled 'port-ui-desktop' feature in web-svc-cdn config by default https://chatgpt.com/share/689d03a8-4c28-800f-8b06-58ce2807b075
75 lines
2.3 KiB
Django/Jinja
75 lines
2.3 KiB
Django/Jinja
|
||
lua_need_request_body on;
|
||
|
||
header_filter_by_lua_block {
|
||
local ct = ngx.header.content_type or ""
|
||
if ct:lower():find("^text/html") then
|
||
ngx.ctx.is_html = true
|
||
else
|
||
ngx.ctx.is_html = false
|
||
end
|
||
}
|
||
|
||
body_filter_by_lua_block {
|
||
-- only apply further processing if this is an HTML response
|
||
if not ngx.ctx.is_html then
|
||
return
|
||
end
|
||
|
||
-- initialize or reuse the buffer
|
||
ngx.ctx.buf = ngx.ctx.buf or {}
|
||
local chunk, eof = ngx.arg[1], ngx.arg[2]
|
||
|
||
if chunk ~= "" then
|
||
table.insert(ngx.ctx.buf, chunk)
|
||
end
|
||
|
||
if not eof then
|
||
-- drop intermediate chunks; we’ll emit only on eof
|
||
ngx.arg[1] = nil
|
||
return
|
||
end
|
||
|
||
-- on eof: concatenate all buffered chunks
|
||
local whole = table.concat(ngx.ctx.buf)
|
||
ngx.ctx.buf = nil -- clear buffer
|
||
|
||
-- remove html CSP, due to management via infinito nexus policies
|
||
whole = whole:gsub(
|
||
'<meta[^>]-http%-equiv=["\']Content%-Security%-Policy["\'][^>]->%s*',
|
||
''
|
||
)
|
||
|
||
-- build a list of head-injection snippets
|
||
local head_snippets = {}
|
||
|
||
{% for head_feature in ['css', 'matomo', 'port-ui-desktop', 'javascript', 'logout' ] %}
|
||
{% if applications | get_app_conf(application_id, 'features.' ~ head_feature, false) | bool %}
|
||
head_snippets[#head_snippets + 1] = [=[
|
||
{%- include "roles/srv-web-7-7-inj-" ~ head_feature ~ "/templates/head_sub.j2" -%}
|
||
]=]
|
||
{% endif %}
|
||
{% endfor %}
|
||
|
||
-- inject all collected snippets right before </head>
|
||
local head_payload = table.concat(head_snippets, "\n") .. "</head>"
|
||
whole = string.gsub(whole, "</head>", head_payload)
|
||
|
||
-- build a list of body-injection snippets
|
||
local body_snippets = {}
|
||
|
||
{% for body_feature in ['matomo', 'logout', 'port-ui-desktop'] %}
|
||
{% if applications | get_app_conf(application_id, 'features.' ~ body_feature, false) | bool %}
|
||
body_snippets[#body_snippets + 1] = [=[
|
||
{%- include "roles/srv-web-7-7-inj-" ~ body_feature ~ "/templates/body_sub.j2" -%}
|
||
]=]
|
||
{% endif %}
|
||
{% endfor %}
|
||
|
||
-- inject all collected snippets right before </body>
|
||
local body_payload = table.concat(body_snippets, "\n") .. "</body>"
|
||
whole = string.gsub(whole, "</body>", body_payload)
|
||
|
||
-- finally send the modified HTML out
|
||
ngx.arg[1] = whole
|
||
} |