mirror of
https://github.com/dani-garcia/vaultwarden.git
synced 2025-03-27 16:01:00 -04:00
- Able to modify the user type per organization - Able to remove a whole organization - Added podman detection - Only show web-vault update when not running a containerized bitwarden_rs Solves #936
303 lines
16 KiB
Handlebars
303 lines
16 KiB
Handlebars
<main class="container-xl">
|
|
<div id="diagnostics-block" class="my-3 p-3 bg-white rounded shadow">
|
|
<h6 class="border-bottom pb-2 mb-2">Diagnostics</h6>
|
|
|
|
<h3>Version</h3>
|
|
<div class="row">
|
|
<div class="col-md">
|
|
<dl class="row">
|
|
<dt class="col-sm-5">Server Installed
|
|
<span class="badge badge-success d-none" id="server-success" title="Latest version is installed.">Ok</span>
|
|
<span class="badge badge-warning d-none" id="server-warning" title="There seems to be an update available.">Update</span>
|
|
<span class="badge badge-info d-none" id="server-branch" title="This is a branched version.">Branched</span>
|
|
</dt>
|
|
<dd class="col-sm-7">
|
|
<span id="server-installed">{{version}}</span>
|
|
</dd>
|
|
<dt class="col-sm-5">Server Latest
|
|
<span class="badge badge-secondary d-none" id="server-failed" title="Unable to determine latest version.">Unknown</span>
|
|
</dt>
|
|
<dd class="col-sm-7">
|
|
<span id="server-latest">{{diagnostics.latest_release}}<span id="server-latest-commit" class="d-none">-{{diagnostics.latest_commit}}</span></span>
|
|
</dd>
|
|
<dt class="col-sm-5">Web Installed
|
|
<span class="badge badge-success d-none" id="web-success" title="Latest version is installed.">Ok</span>
|
|
<span class="badge badge-warning d-none" id="web-warning" title="There seems to be an update available.">Update</span>
|
|
</dt>
|
|
<dd class="col-sm-7">
|
|
<span id="web-installed">{{diagnostics.web_vault_version}}</span>
|
|
</dd>
|
|
{{#unless diagnostics.running_within_docker}}
|
|
<dt class="col-sm-5">Web Latest
|
|
<span class="badge badge-secondary d-none" id="web-failed" title="Unable to determine latest version.">Unknown</span>
|
|
</dt>
|
|
<dd class="col-sm-7">
|
|
<span id="web-latest">{{diagnostics.latest_web_build}}</span>
|
|
</dd>
|
|
{{/unless}}
|
|
</dl>
|
|
</div>
|
|
</div>
|
|
|
|
<h3>Checks</h3>
|
|
<div class="row">
|
|
<div class="col-md">
|
|
<dl class="row">
|
|
<dt class="col-sm-5">Running within Docker</dt>
|
|
<dd class="col-sm-7">
|
|
{{#if diagnostics.running_within_docker}}
|
|
<span id="running-docker" class="d-block"><b>Yes</b></span>
|
|
{{/if}}
|
|
{{#unless diagnostics.running_within_docker}}
|
|
<span id="running-docker" class="d-block"><b>No</b></span>
|
|
{{/unless}}
|
|
</dd>
|
|
<dt class="col-sm-5">Uses a proxy</dt>
|
|
<dd class="col-sm-7">
|
|
{{#if diagnostics.uses_proxy}}
|
|
<span id="running-docker" class="d-block"><b>Yes</b></span>
|
|
{{/if}}
|
|
{{#unless diagnostics.uses_proxy}}
|
|
<span id="running-docker" class="d-block"><b>No</b></span>
|
|
{{/unless}}
|
|
</dd>
|
|
<dt class="col-sm-5">Internet access
|
|
{{#if diagnostics.has_http_access}}
|
|
<span class="badge badge-success" id="internet-success" title="We have internet access!">Ok</span>
|
|
{{/if}}
|
|
{{#unless diagnostics.has_http_access}}
|
|
<span class="badge badge-danger" id="internet-warning" title="There seems to be no internet access. Please fix.">Error</span>
|
|
{{/unless}}
|
|
</dt>
|
|
<dd class="col-sm-7">
|
|
{{#if diagnostics.has_http_access}}
|
|
<span id="running-docker" class="d-block"><b>Yes</b></span>
|
|
{{/if}}
|
|
{{#unless diagnostics.has_http_access}}
|
|
<span id="running-docker" class="d-block"><b>No</b></span>
|
|
{{/unless}}
|
|
</dd>
|
|
<dt class="col-sm-5">DNS (github.com)
|
|
<span class="badge badge-success d-none" id="dns-success" title="DNS Resolving works!">Ok</span>
|
|
<span class="badge badge-danger d-none" id="dns-warning" title="DNS Resolving failed. Please fix.">Error</span>
|
|
</dt>
|
|
<dd class="col-sm-7">
|
|
<span id="dns-resolved">{{diagnostics.dns_resolved}}</span>
|
|
</dd>
|
|
|
|
<dt class="col-sm-5">Date & Time (UTC)
|
|
<span class="badge badge-success d-none" id="time-success" title="Time offsets seem to be correct.">Ok</span>
|
|
<span class="badge badge-danger d-none" id="time-warning" title="Time offsets are too mouch at drift.">Error</span>
|
|
</dt>
|
|
<dd class="col-sm-7">
|
|
<span id="time-server" class="d-block"><b>Server:</b> <span id="time-server-string">{{diagnostics.server_time}}</span></span>
|
|
<span id="time-browser" class="d-block"><b>Browser:</b> <span id="time-browser-string"></span></span>
|
|
</dd>
|
|
|
|
<dt class="col-sm-5">Domain configuration
|
|
<span class="badge badge-success d-none" id="domain-success" title="The domain variable matches the browser location and seems to be configured correctly.">Match</span>
|
|
<span class="badge badge-danger d-none" id="domain-warning" title="The domain variable does not matches the browsers location.
The domain variable does not seem to be configured correctly.
Some features may not work as expected!">No Match</span>
|
|
<span class="badge badge-success d-none" id="https-success" title="Configurued to use HTTPS">HTTPS</span>
|
|
<span class="badge badge-danger d-none" id="https-warning" title="Not configured to use HTTPS.
Some features may not work as expected!">No HTTPS</span>
|
|
</dt>
|
|
<dd class="col-sm-7">
|
|
<span id="domain-server" class="d-block"><b>Server:</b> <span id="domain-server-string">{{diagnostics.admin_url}}</span></span>
|
|
<span id="domain-browser" class="d-block"><b>Browser:</b> <span id="domain-browser-string"></span></span>
|
|
</dd>
|
|
</dl>
|
|
</div>
|
|
</div>
|
|
|
|
<h3>Support</h3>
|
|
<div class="row">
|
|
<div class="col-md">
|
|
<dl class="row">
|
|
<dd class="col-sm-12">
|
|
If you need support please check the following links first before you create a new issue:
|
|
<a href="https://bitwardenrs.discourse.group/" target="_blank" rel="noreferrer">Bitwarden_RS Forum</a>
|
|
| <a href="https://github.com/dani-garcia/bitwarden_rs/discussions" target="_blank" rel="noreferrer">Github Discussions</a>
|
|
</dd>
|
|
</dl>
|
|
<dl class="row">
|
|
<dd class="col-sm-12">
|
|
You can use the button below to pre-generate a string which you can copy/paste on either the Forum or when Creating a new issue at Github.<br>
|
|
We try to hide the most sensitive values from the generated support string by default, but please verify if there is nothing in there which you want to hide!<br>
|
|
</dd>
|
|
</dl>
|
|
<dl class="row">
|
|
<dt class="col-sm-3">
|
|
<button type="button" id="gen-support" class="btn btn-primary" onclick="generateSupportString(); return false;">Generate Support String</button>
|
|
<br><br>
|
|
<button type="button" id="copy-support" class="btn btn-info d-none" onclick="copyToClipboard(); return false;">Copy To Clipboard</button>
|
|
</dt>
|
|
<dd class="col-sm-9">
|
|
<pre id="support-string" class="pre-scrollable d-none" style="width: 100%; height: 16em; size: 0.6em; border: 1px solid; padding: 4px;"></pre>
|
|
</dd>
|
|
</dl>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</main>
|
|
|
|
<script>
|
|
dnsCheck = false;
|
|
timeCheck = false;
|
|
domainCheck = false;
|
|
httpsCheck = false;
|
|
(() => {
|
|
// ================================
|
|
// Date & Time Check
|
|
const d = new Date();
|
|
const year = d.getUTCFullYear();
|
|
const month = String(d.getUTCMonth()+1).padStart(2, '0');
|
|
const day = String(d.getUTCDate()).padStart(2, '0');
|
|
const hour = String(d.getUTCHours()).padStart(2, '0');
|
|
const minute = String(d.getUTCMinutes()).padStart(2, '0');
|
|
const seconds = String(d.getUTCSeconds()).padStart(2, '0');
|
|
const browserUTC = `${year}-${month}-${day} ${hour}:${minute}:${seconds} UTC`;
|
|
document.getElementById("time-browser-string").innerText = browserUTC;
|
|
|
|
const serverUTC = document.getElementById("time-server-string").innerText;
|
|
const timeDrift = (Date.parse(serverUTC) - Date.parse(browserUTC)) / 1000;
|
|
if (timeDrift > 30 || timeDrift < -30) {
|
|
document.getElementById('time-warning').classList.remove('d-none');
|
|
} else {
|
|
document.getElementById('time-success').classList.remove('d-none');
|
|
timeCheck = true;
|
|
}
|
|
|
|
// ================================
|
|
// Check if the output is a valid IP
|
|
const isValidIp = value => (/^(?:(?:^|\.)(?:2(?:5[0-5]|[0-4]\d)|1?\d?\d)){4}$/.test(value) ? true : false);
|
|
if (isValidIp(document.getElementById('dns-resolved').innerText)) {
|
|
document.getElementById('dns-success').classList.remove('d-none');
|
|
dnsCheck = true;
|
|
} else {
|
|
document.getElementById('dns-warning').classList.remove('d-none');
|
|
}
|
|
|
|
// ================================
|
|
// Version check for both bitwarden_rs and web-vault
|
|
let serverInstalled = document.getElementById('server-installed').innerText;
|
|
let serverLatest = document.getElementById('server-latest').innerText;
|
|
let serverLatestCommit = document.getElementById('server-latest-commit').innerText.replace('-', '');
|
|
if (serverInstalled.indexOf('-') !== -1 && serverLatest !== '-' && serverLatestCommit !== '-') {
|
|
document.getElementById('server-latest-commit').classList.remove('d-none');
|
|
}
|
|
|
|
const webInstalled = document.getElementById('web-installed').innerText;
|
|
checkVersions('server', serverInstalled, serverLatest, serverLatestCommit);
|
|
|
|
{{#unless diagnostics.running_within_docker}}
|
|
const webLatest = document.getElementById('web-latest').innerText;
|
|
checkVersions('web', webInstalled, webLatest);
|
|
{{/unless}}
|
|
|
|
function checkVersions(platform, installed, latest, commit=null) {
|
|
if (installed === '-' || latest === '-') {
|
|
document.getElementById(platform + '-failed').classList.remove('d-none');
|
|
return;
|
|
}
|
|
|
|
// Only check basic versions, no commit revisions
|
|
if (commit === null || installed.indexOf('-') === -1) {
|
|
if (installed !== latest) {
|
|
document.getElementById(platform + '-warning').classList.remove('d-none');
|
|
} else {
|
|
document.getElementById(platform + '-success').classList.remove('d-none');
|
|
}
|
|
} else {
|
|
// Check if this is a branched version.
|
|
const branchRegex = /(?:\s)\((.*?)\)/;
|
|
const branchMatch = installed.match(branchRegex);
|
|
if (branchMatch !== null) {
|
|
document.getElementById(platform + '-branch').classList.remove('d-none');
|
|
}
|
|
|
|
// This will remove branch info and check if there is a commit hash
|
|
const installedRegex = /(\d+\.\d+\.\d+)-(\w+)/;
|
|
const instMatch = installed.match(installedRegex);
|
|
|
|
// It could be that a new tagged version has the same commit hash.
|
|
// In this case the version is the same but only the number is different
|
|
if (instMatch !== null) {
|
|
if (instMatch[2] === commit) {
|
|
// The commit hashes are the same, so latest version is installed
|
|
document.getElementById(platform + '-success').classList.remove('d-none');
|
|
return;
|
|
}
|
|
}
|
|
|
|
if (installed === latest) {
|
|
document.getElementById(platform + '-success').classList.remove('d-none');
|
|
} else {
|
|
document.getElementById(platform + '-warning').classList.remove('d-none');
|
|
}
|
|
}
|
|
}
|
|
|
|
// ================================
|
|
// Check valid DOMAIN configuration
|
|
document.getElementById('domain-browser-string').innerText = location.href.toLowerCase();
|
|
if (document.getElementById('domain-server-string').innerText.toLowerCase() == location.href.toLowerCase()) {
|
|
document.getElementById('domain-success').classList.remove('d-none');
|
|
domainCheck = true;
|
|
} else {
|
|
document.getElementById('domain-warning').classList.remove('d-none');
|
|
}
|
|
|
|
// Check for HTTPS at domain-server-string
|
|
if (document.getElementById('domain-server-string').innerText.toLowerCase().startsWith('https://') ) {
|
|
document.getElementById('https-success').classList.remove('d-none');
|
|
httpsCheck = true;
|
|
} else {
|
|
document.getElementById('https-warning').classList.remove('d-none');
|
|
}
|
|
})();
|
|
|
|
// ================================
|
|
// Generate support string to be pasted on github or the forum
|
|
async function generateSupportString() {
|
|
supportString = "### Your environment (Generated via diagnostics page)\n";
|
|
|
|
supportString += "* Bitwarden_rs version: v{{ version }}\n";
|
|
supportString += "* Web-vault version: v{{ diagnostics.web_vault_version }}\n";
|
|
supportString += "* Running within Docker: {{ diagnostics.running_within_docker }}\n";
|
|
supportString += "* Internet access: {{ diagnostics.has_http_access }}\n";
|
|
supportString += "* Uses a proxy: {{ diagnostics.uses_proxy }}\n";
|
|
supportString += "* DNS Check: " + dnsCheck + "\n";
|
|
supportString += "* Time Check: " + timeCheck + "\n";
|
|
supportString += "* Domain Configuration Check: " + domainCheck + "\n";
|
|
supportString += "* HTTPS Check: " + httpsCheck + "\n";
|
|
supportString += "* Database type: {{ diagnostics.db_type }}\n";
|
|
{{#case diagnostics.db_type "MySQL" "PostgreSQL"}}
|
|
supportString += "* Database version: [PLEASE PROVIDE DATABASE VERSION]\n";
|
|
{{/case}}
|
|
supportString += "* Clients used: \n";
|
|
supportString += "* Reverse proxy and version: \n";
|
|
supportString += "* Other relevant information: \n";
|
|
|
|
jsonResponse = await fetch('{{urlpath}}/admin/diagnostics/config');
|
|
configJson = await jsonResponse.json();
|
|
supportString += "\n### Config (Generated via diagnostics page)\n```json\n" + JSON.stringify(configJson, undefined, 2) + "\n```\n";
|
|
|
|
document.getElementById('support-string').innerText = supportString;
|
|
document.getElementById('support-string').classList.remove('d-none');
|
|
document.getElementById('copy-support').classList.remove('d-none');
|
|
}
|
|
|
|
function copyToClipboard() {
|
|
const str = document.getElementById('support-string').innerText;
|
|
const el = document.createElement('textarea');
|
|
el.value = str;
|
|
el.setAttribute('readonly', '');
|
|
el.style.position = 'absolute';
|
|
el.style.left = '-9999px';
|
|
document.body.appendChild(el);
|
|
el.select();
|
|
document.execCommand('copy');
|
|
document.body.removeChild(el);
|
|
}
|
|
|
|
</script>
|