diff options
author | Jeremy Davis <jeremy.davis@sonarsource.com> | 2022-09-06 18:05:27 +0200 |
---|---|---|
committer | sonartech <sonartech@sonarsource.com> | 2022-09-09 20:02:58 +0000 |
commit | 0895d305cc683ac9c1a0448b9ea00277cd372eb6 (patch) | |
tree | 56a731aaca55165c0176853df4740fdbd1c23167 | |
parent | 1ea0fba721acca7bfbdbed82cdeaf779e39ca85f (diff) | |
download | sonarqube-0895d305cc683ac9c1a0448b9ea00277cd372eb6.tar.gz sonarqube-0895d305cc683ac9c1a0448b9ea00277cd372eb6.zip |
SONAR-17296 SAML auth test result HTML template
-rw-r--r-- | server/sonar-auth-saml/src/main/resources/samlAuthResult.html | 208 |
1 files changed, 208 insertions, 0 deletions
diff --git a/server/sonar-auth-saml/src/main/resources/samlAuthResult.html b/server/sonar-auth-saml/src/main/resources/samlAuthResult.html new file mode 100644 index 00000000000..c6c0108802d --- /dev/null +++ b/server/sonar-auth-saml/src/main/resources/samlAuthResult.html @@ -0,0 +1,208 @@ +<!DOCTYPE html> +<html lang="en"> + <head> + <meta http-equiv="content-type" content="text/html; charset=UTF-8" charset="UTF-8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge" /> + <link rel="apple-touch-icon" href="%WEB_CONTEXT%/apple-touch-icon.png" /> + <link rel="apple-touch-icon" sizes="57x57" href="%WEB_CONTEXT%/apple-touch-icon-57x57.png" /> + <link rel="apple-touch-icon" sizes="60x60" href="%WEB_CONTEXT%/apple-touch-icon-60x60.png" /> + <link rel="apple-touch-icon" sizes="72x72" href="%WEB_CONTEXT%/apple-touch-icon-72x72.png" /> + <link rel="apple-touch-icon" sizes="76x76" href="%WEB_CONTEXT%/apple-touch-icon-76x76.png" /> + <link + rel="apple-touch-icon" + sizes="114x114" + href="%WEB_CONTEXT%/apple-touch-icon-114x114.png" + /> + <link + rel="apple-touch-icon" + sizes="120x120" + href="%WEB_CONTEXT%/apple-touch-icon-120x120.png" + /> + <link + rel="apple-touch-icon" + sizes="144x144" + href="%WEB_CONTEXT%/apple-touch-icon-144x144.png" + /> + <link + rel="apple-touch-icon" + sizes="152x152" + href="%WEB_CONTEXT%/apple-touch-icon-152x152.png" + /> + <link + rel="apple-touch-icon" + sizes="180x180" + href="%WEB_CONTEXT%/apple-touch-icon-180x180.png" + /> + <link rel="icon" type="image/x-icon" href="%WEB_CONTEXT%/favicon.ico" /> + <meta name="application-name" content="SonarQube" /> + <meta name="msapplication-TileColor" content="#FFFFFF" /> + <meta name="msapplication-TileImage" content="%WEB_CONTEXT%/mstile-512x512.png" /> + <title>SAML Authentication Test</title> + + <style> + body { + background-color: #f3f3f3; + } + + h1 { + margin: 0 8px 8px; + } + h2 { + margin: 0 0 8px; + } + + ul { + list-style: none; + margin: 0 8px; + padding: 0; + } + + li + li { + padding-top: 12px; + margin-top: 12px; + border-top: 1px solid rgba(150, 150, 150, 0.5); + } + + table { + border-collapse: collapse; + } + + tr:nth-child(2n) { + background-color: #e6e6e6; + } + + td { + border: 1px solid #a3a3a3; + padding: 4px 24px 4px 8px; + vertical-align: top; + font-family: "Courier New", Courier, monospace; + } + + #content { + padding: 16px; + } + + .box { + padding: 8px; + margin: 8px; + border: 1px solid #e6e6e6; + background-color: white; + box-shadow: 2px 2px 3px 0px rgba(0, 0, 0, 0.5); + } + + #status { + padding: 16px 8px; + font-size: large; + color: white; + } + + .error { + background-color: #d02f3a; + } + + .success { + background-color: #008a25; + } + </style> + </head> + + <body> + <div id="content"> + <h1>SAML Authentication Test</h1> + <div class="box"> + <div id="status"></div> + </div> + </div> + + <script> + function createBox() { + const box = document.createElement("div"); + box.className = "box"; + return box; + } + + function createSectionTitle(title) { + const node = document.createElement("h2"); + node.innerText = title; + return node; + } + + function createList(arr, className = "") { + const list = document.createElement("ul"); + + arr.forEach((item) => { + const message = document.createElement("li"); + message.className = className; + message.innerText = item; + list.appendChild(message); + }); + + return list; + } + + function createTable(obj) { + const table = document.createElement("table"); + const tbody = document.createElement("tbody"); + table.appendChild(tbody); + + Object.keys(obj).forEach((key) => { + const row = document.createElement("tr"); + + const keyNode = document.createElement("td"); + keyNode.innerText = key; + row.appendChild(keyNode); + + const valueNode = document.createElement("td"); + // wrap in array, to handle single values as well + valueNode.innerHTML = [].concat(obj[key]).join("<br />"); + row.appendChild(valueNode); + + tbody.appendChild(row); + }); + + return table; + } + + function addSection(container, title, contents) { + const box = createBox(); + + box.appendChild(createSectionTitle(title)); + box.appendChild(contents); + + container.appendChild(box); + } + + const status = %STATUS%; + const attributes = %AVAILABLE_ATTRIBUTES%; + const mappings = %ATTRIBUTE_MAPPINGS%; + const errors = %ERRORS%; + const warnings = %WARNINGS%; + + // Switch status class + const statusNode = document.querySelector("#status"); + statusNode.classList.add(status); + statusNode.innerText = status; + + // generate content + const container = document.querySelector("#content"); + + if (warnings && warnings.length > 0) { + addSection(container, "Warnings", createList(warnings)); + } + + if (status === "error" && errors && errors.length > 0) { + addSection(container, "Errors", createList(errors)); + } + + if (status === "success") { + if (attributes && Object.keys(attributes).length > 0) { + addSection(container, "Available attributes", createTable(attributes)); + } + + if (mappings && Object.keys(mappings).length > 0) { + addSection(container, "Attribute mappings", createTable(mappings)); + } + } + </script> + </body> +</html> |