aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeremy Davis <jeremy.davis@sonarsource.com>2022-09-06 18:05:27 +0200
committersonartech <sonartech@sonarsource.com>2022-09-09 20:02:58 +0000
commit0895d305cc683ac9c1a0448b9ea00277cd372eb6 (patch)
tree56a731aaca55165c0176853df4740fdbd1c23167
parent1ea0fba721acca7bfbdbed82cdeaf779e39ca85f (diff)
downloadsonarqube-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.html208
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>