aboutsummaryrefslogtreecommitdiff
path: root/src/static
diff options
context:
space:
mode:
Diffstat (limited to 'src/static')
-rw-r--r--src/static/scripts/admin.css6
-rw-r--r--src/static/scripts/admin_diagnostics.js32
-rw-r--r--src/static/scripts/admin_organizations.js2
-rw-r--r--src/static/scripts/admin_users.js2
-rw-r--r--src/static/scripts/datatables.css29
-rw-r--r--src/static/scripts/datatables.js64
-rw-r--r--src/static/templates/admin/diagnostics.hbs9
-rw-r--r--src/static/templates/admin/organizations.hbs10
-rw-r--r--src/static/templates/admin/users.hbs12
9 files changed, 117 insertions, 49 deletions
diff --git a/src/static/scripts/admin.css b/src/static/scripts/admin.css
index 67f2c00d..d700af3c 100644
--- a/src/static/scripts/admin.css
+++ b/src/static/scripts/admin.css
@@ -25,10 +25,14 @@ img {
min-width: 85px;
max-width: 85px;
}
-#users-table .vw-items, #orgs-table .vw-items, #orgs-table .vw-users {
+#users-table .vw-ciphers, #orgs-table .vw-users, #orgs-table .vw-ciphers {
min-width: 35px;
max-width: 40px;
}
+#orgs-table .vw-misc {
+ min-width: 65px;
+ max-width: 80px;
+}
#users-table .vw-attachments, #orgs-table .vw-attachments {
min-width: 100px;
max-width: 130px;
diff --git a/src/static/scripts/admin_diagnostics.js b/src/static/scripts/admin_diagnostics.js
index a7a574fc..5fbed2da 100644
--- a/src/static/scripts/admin_diagnostics.js
+++ b/src/static/scripts/admin_diagnostics.js
@@ -4,6 +4,7 @@
var dnsCheck = false;
var timeCheck = false;
+var ntpTimeCheck = false;
var domainCheck = false;
var httpsCheck = false;
@@ -90,7 +91,8 @@ async function generateSupportString(event, dj) {
supportString += `* Internet access: ${dj.has_http_access}\n`;
supportString += `* Internet access via a proxy: ${dj.uses_proxy}\n`;
supportString += `* DNS Check: ${dnsCheck}\n`;
- supportString += `* Time Check: ${timeCheck}\n`;
+ supportString += `* Browser/Server Time Check: ${timeCheck}\n`;
+ supportString += `* Server/NTP Time Check: ${ntpTimeCheck}\n`;
supportString += `* Domain Configuration Check: ${domainCheck}\n`;
supportString += `* HTTPS Check: ${httpsCheck}\n`;
supportString += `* Database type: ${dj.db_type}\n`;
@@ -136,16 +138,17 @@ function copyToClipboard(event) {
new BSN.Toast("#toastClipboardCopy").show();
}
-function checkTimeDrift(browserUTC, serverUTC) {
+function checkTimeDrift(utcTimeA, utcTimeB, statusPrefix) {
const timeDrift = (
- Date.parse(serverUTC.replace(" ", "T").replace(" UTC", "")) -
- Date.parse(browserUTC.replace(" ", "T").replace(" UTC", ""))
+ Date.parse(utcTimeA.replace(" ", "T").replace(" UTC", "")) -
+ Date.parse(utcTimeB.replace(" ", "T").replace(" UTC", ""))
) / 1000;
- if (timeDrift > 20 || timeDrift < -20) {
- document.getElementById("time-warning").classList.remove("d-none");
+ if (timeDrift > 15 || timeDrift < -15) {
+ document.getElementById(`${statusPrefix}-warning`).classList.remove("d-none");
+ return false;
} else {
- document.getElementById("time-success").classList.remove("d-none");
- timeCheck = true;
+ document.getElementById(`${statusPrefix}-success`).classList.remove("d-none");
+ return true;
}
}
@@ -195,7 +198,18 @@ function checkDns(dns_resolved) {
function init(dj) {
// Time check
document.getElementById("time-browser-string").innerText = browserUTC;
- checkTimeDrift(browserUTC, dj.server_time);
+
+ // Check if we were able to fetch a valid NTP Time
+ // If so, compare both browser and server with NTP
+ // Else, compare browser and server.
+ if (dj.ntp_time.indexOf("UTC") !== -1) {
+ timeCheck = checkTimeDrift(dj.server_time, browserUTC, "time");
+ checkTimeDrift(dj.ntp_time, browserUTC, "ntp-browser");
+ ntpTimeCheck = checkTimeDrift(dj.ntp_time, dj.server_time, "ntp-server");
+ } else {
+ timeCheck = checkTimeDrift(dj.server_time, browserUTC, "time");
+ ntpTimeCheck = "n/a";
+ }
// Domain check
const browserURL = location.href.toLowerCase();
diff --git a/src/static/scripts/admin_organizations.js b/src/static/scripts/admin_organizations.js
index db4037b4..c885344e 100644
--- a/src/static/scripts/admin_organizations.js
+++ b/src/static/scripts/admin_organizations.js
@@ -54,7 +54,7 @@ document.addEventListener("DOMContentLoaded", (/*event*/) => {
],
"pageLength": -1, // Default show all
"columnDefs": [{
- "targets": 4,
+ "targets": [4,5],
"searchable": false,
"orderable": false
}]
diff --git a/src/static/scripts/admin_users.js b/src/static/scripts/admin_users.js
index b4da0f97..95d4f074 100644
--- a/src/static/scripts/admin_users.js
+++ b/src/static/scripts/admin_users.js
@@ -238,7 +238,7 @@ document.addEventListener("DOMContentLoaded", (/*event*/) => {
[-1, 2, 5, 10, 25, 50],
["All", 2, 5, 10, 25, 50]
],
- "pageLength": 2, // Default show all
+ "pageLength": -1, // Default show all
"columnDefs": [{
"targets": [1, 2],
"type": "date-iso"
diff --git a/src/static/scripts/datatables.css b/src/static/scripts/datatables.css
index a19cb110..d22b2250 100644
--- a/src/static/scripts/datatables.css
+++ b/src/static/scripts/datatables.css
@@ -4,13 +4,19 @@
*
* To rebuild or modify this file with the latest versions of the included
* software please visit:
- * https://datatables.net/download/#bs5/dt-1.13.1
+ * https://datatables.net/download/#bs5/dt-1.13.2
*
* Included libraries:
- * DataTables 1.13.1
+ * DataTables 1.13.2
*/
@charset "UTF-8";
+:root {
+ --dt-row-selected: 13, 110, 253;
+ --dt-row-selected-text: 255, 255, 255;
+ --dt-row-selected-link: 9, 10, 11;
+}
+
table.dataTable td.dt-control {
text-align: center;
cursor: pointer;
@@ -126,7 +132,7 @@ div.dataTables_processing > div:last-child > div {
width: 13px;
height: 13px;
border-radius: 50%;
- background: rgba(13, 110, 253, 0.9);
+ background: 13 110 253;
animation-timing-function: cubic-bezier(0, 1, 1, 0);
}
div.dataTables_processing > div:last-child > div:nth-child(1) {
@@ -284,23 +290,28 @@ table.dataTable > tbody > tr {
background-color: transparent;
}
table.dataTable > tbody > tr.selected > * {
- box-shadow: inset 0 0 0 9999px rgba(13, 110, 253, 0.9);
- color: white;
+ box-shadow: inset 0 0 0 9999px rgb(13, 110, 253);
+ box-shadow: inset 0 0 0 9999px rgb(var(--dt-row-selected));
+ color: rgb(255, 255, 255);
+ color: rgb(var(--dt-row-selected-text));
}
table.dataTable > tbody > tr.selected a {
- color: #090a0b;
+ color: rgb(9, 10, 11);
+ color: rgb(var(--dt-row-selected-link));
}
table.dataTable.table-striped > tbody > tr.odd > * {
box-shadow: inset 0 0 0 9999px rgba(0, 0, 0, 0.05);
}
table.dataTable.table-striped > tbody > tr.odd.selected > * {
box-shadow: inset 0 0 0 9999px rgba(13, 110, 253, 0.95);
+ box-shadow: inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.95);
}
table.dataTable.table-hover > tbody > tr:hover > * {
box-shadow: inset 0 0 0 9999px rgba(0, 0, 0, 0.075);
}
table.dataTable.table-hover > tbody > tr.selected:hover > * {
box-shadow: inset 0 0 0 9999px rgba(13, 110, 253, 0.975);
+ box-shadow: inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.975);
}
div.dataTables_wrapper div.dataTables_length label {
@@ -374,9 +385,9 @@ div.dataTables_scrollFoot > .dataTables_scrollFootInner > table {
@media screen and (max-width: 767px) {
div.dataTables_wrapper div.dataTables_length,
-div.dataTables_wrapper div.dataTables_filter,
-div.dataTables_wrapper div.dataTables_info,
-div.dataTables_wrapper div.dataTables_paginate {
+ div.dataTables_wrapper div.dataTables_filter,
+ div.dataTables_wrapper div.dataTables_info,
+ div.dataTables_wrapper div.dataTables_paginate {
text-align: center;
}
div.dataTables_wrapper div.dataTables_paginate ul.pagination {
diff --git a/src/static/scripts/datatables.js b/src/static/scripts/datatables.js
index 1aeda982..9854358e 100644
--- a/src/static/scripts/datatables.js
+++ b/src/static/scripts/datatables.js
@@ -4,20 +4,20 @@
*
* To rebuild or modify this file with the latest versions of the included
* software please visit:
- * https://datatables.net/download/#bs5/dt-1.13.1
+ * https://datatables.net/download/#bs5/dt-1.13.2
*
* Included libraries:
- * DataTables 1.13.1
+ * DataTables 1.13.2
*/
-/*! DataTables 1.13.1
- * ©2008-2022 SpryMedia Ltd - datatables.net/license
+/*! DataTables 1.13.2
+ * ©2008-2023 SpryMedia Ltd - datatables.net/license
*/
/**
* @summary DataTables
* @description Paginate, search and order HTML tables
- * @version 1.13.1
+ * @version 1.13.2
* @author SpryMedia Ltd
* @contact www.datatables.net
* @copyright SpryMedia Ltd.
@@ -1382,7 +1382,12 @@
var _isNumber = function ( d, decimalPoint, formatted ) {
- var strType = typeof d === 'string';
+ let type = typeof d;
+ var strType = type === 'string';
+
+ if ( type === 'number' || type === 'bigint') {
+ return true;
+ }
// If empty return immediately so there must be a number if it is a
// formatted string (this stops the string "k", or "kr", etc being detected
@@ -6789,8 +6794,15 @@
if ( eventName !== null ) {
var e = $.Event( eventName+'.dt' );
+ var table = $(settings.nTable);
- $(settings.nTable).trigger( e, args );
+ table.trigger( e, args );
+
+ // If not yet attached to the document, trigger the event
+ // on the body directly to sort of simulate the bubble
+ if (table.parents('body').length === 0) {
+ $('body').trigger( e, args );
+ }
ret.push( e.result );
}
@@ -7256,7 +7268,7 @@
pluck: function ( prop )
{
- let fn = DataTable.util.get(prop);
+ var fn = DataTable.util.get(prop);
return this.map( function ( el ) {
return fn(el);
@@ -8353,10 +8365,9 @@
$(document).on('plugin-init.dt', function (e, context) {
var api = new _Api( context );
-
- const namespace = 'on-plugin-init';
- const stateSaveParamsEvent = `stateSaveParams.${namespace}`;
- const destroyEvent = `destroy.${namespace}`;
+ var namespace = 'on-plugin-init';
+ var stateSaveParamsEvent = 'stateSaveParams.' + namespace;
+ var destroyEvent = 'destroy. ' + namespace;
api.on( stateSaveParamsEvent, function ( e, settings, d ) {
// This could be more compact with the API, but it is a lot faster as a simple
@@ -8375,7 +8386,7 @@
});
api.on( destroyEvent, function () {
- api.off(`${stateSaveParamsEvent} ${destroyEvent}`);
+ api.off(stateSaveParamsEvent + ' ' + destroyEvent);
});
var loaded = api.state.loaded();
@@ -9697,7 +9708,7 @@
* @type string
* @default Version number
*/
- DataTable.version = "1.13.1";
+ DataTable.version = "1.13.2";
/**
* Private data store, containing all of the settings objects that are
@@ -14121,7 +14132,7 @@
*
* @type string
*/
- build:"bs5/dt-1.13.1",
+ build:"bs5/dt-1.13.2",
/**
@@ -14830,10 +14841,17 @@
}
if ( btnDisplay !== null ) {
- node = $('<a>', {
+ var tag = settings.oInit.pagingTag || 'a';
+ var disabled = btnClass.indexOf(disabledClass) !== -1;
+
+
+ node = $('<'+tag+'>', {
'class': classes.sPageButton+' '+btnClass,
'aria-controls': settings.sTableId,
+ 'aria-disabled': disabled ? 'true' : null,
'aria-label': aria[ button ],
+ 'aria-role': 'link',
+ 'aria-current': btnClass === classes.sPageButtonActive ? 'page' : null,
'data-dt-idx': button,
'tabindex': tabIndex,
'id': idx === 0 && typeof button === 'string' ?
@@ -14965,6 +14983,12 @@
if ( d !== 0 && (!d || d === '-') ) {
return -Infinity;
}
+
+ let type = typeof d;
+
+ if (type === 'number' || type === 'bigint') {
+ return d;
+ }
// If a decimal place other than `.` is used, it needs to be given to the
// function so we can detect it and replace with a `.` which is the only
@@ -15647,7 +15671,6 @@
require('datatables.net')(root, $);
}
-
return factory( $, root, root.document );
};
}
@@ -15755,6 +15778,8 @@ DataTable.ext.renderer.pageButton.bootstrap = function ( settings, host, idx, bu
}
if ( btnDisplay ) {
+ var disabled = btnClass.indexOf('disabled') !== -1;
+
node = $('<li>', {
'class': classes.sPageButton+' '+btnClass,
'id': idx === 0 && typeof button === 'string' ?
@@ -15762,9 +15787,12 @@ DataTable.ext.renderer.pageButton.bootstrap = function ( settings, host, idx, bu
null
} )
.append( $('<a>', {
- 'href': '#',
+ 'href': disabled ? null : '#',
'aria-controls': settings.sTableId,
+ 'aria-disabled': disabled ? 'true' : null,
'aria-label': aria[ button ],
+ 'aria-role': 'link',
+ 'aria-current': btnClass === 'active' ? 'page' : null,
'data-dt-idx': button,
'tabindex': settings.iTabIndex,
'class': 'page-link'
diff --git a/src/static/templates/admin/diagnostics.hbs b/src/static/templates/admin/diagnostics.hbs
index de83ae11..a61d8992 100644
--- a/src/static/templates/admin/diagnostics.hbs
+++ b/src/static/templates/admin/diagnostics.hbs
@@ -144,10 +144,15 @@
<span><b>Server:</b> {{page_data.server_time_local}}</span>
</dd>
<dt class="col-sm-5">Date & Time (UTC)
- <span class="badge bg-success d-none" id="time-success" title="Server and browser times are within 20 seconds of each other.">Ok</span>
- <span class="badge bg-danger d-none" id="time-warning" title="Server and browser times are more than 20 seconds apart.">Error</span>
+ <span class="badge bg-success d-none" id="time-success" title="Server and browser times are within 15 seconds of each other.">Server/Browser Ok</span>
+ <span class="badge bg-danger d-none" id="time-warning" title="Server and browser times are more than 15 seconds apart.">Server/Browser Error</span>
+ <span class="badge bg-success d-none" id="ntp-server-success" title="Server and NTP times are within 15 seconds of each other.">Server NTP Ok</span>
+ <span class="badge bg-danger d-none" id="ntp-server-warning" title="Server and NTP times are more than 15 seconds apart.">Server NTP Error</span>
+ <span class="badge bg-success d-none" id="ntp-browser-success" title="Browser and NTP times are within 15 seconds of each other.">Browser NTP Ok</span>
+ <span class="badge bg-danger d-none" id="ntp-browser-warning" title="Browser and NTP times are more than 15 seconds apart.">Browser NTP Error</span>
</dt>
<dd class="col-sm-7">
+ <span id="ntp-time" class="d-block"><b>NTP:</b> <span id="ntp-server-string">{{page_data.ntp_time}}</span></span>
<span id="time-server" class="d-block"><b>Server:</b> <span id="time-server-string">{{page_data.server_time}}</span></span>
<span id="time-browser" class="d-block"><b>Browser:</b> <span id="time-browser-string"></span></span>
</dd>
diff --git a/src/static/templates/admin/organizations.hbs b/src/static/templates/admin/organizations.hbs
index d95370c4..9dd86622 100644
--- a/src/static/templates/admin/organizations.hbs
+++ b/src/static/templates/admin/organizations.hbs
@@ -7,8 +7,9 @@
<tr>
<th class="vw-org-details">Organization</th>
<th class="vw-users">Users</th>
- <th class="vw-items">Items</th>
+ <th class="vw-ciphers">Ciphers</th>
<th class="vw-attachments">Attachments</th>
+ <th class="vw-misc">Misc</th>
<th class="vw-actions">Actions</th>
</tr>
</thead>
@@ -37,8 +38,13 @@
<span class="d-block"><strong>Size:</strong> {{attachment_size}}</span>
{{/if}}
</td>
+ <td>
+ <span class="d-block"><strong>Collections:</strong> {{collection_count}}</span>
+ <span class="d-block"><strong>Groups:</strong> {{group_count}}</span>
+ <span class="d-block"><strong>Events:</strong> {{event_count}}</span>
+ </td>
<td class="text-end px-0 small">
- <button type="button" class="btn btn-sm btn-link p-0 border-0 float-right" vw-delete-organization data-vw-org-uuid="{{jsesc Id no_quote}}" data-vw-org-name="{{jsesc Name no_quote}}" data-vw-billing-email="{{jsesc BillingEmail no_quote}}">Delete Organization</button>
+ <button type="button" class="btn btn-sm btn-link p-0 border-0 float-right" vw-delete-organization data-vw-org-uuid="{{jsesc Id no_quote}}" data-vw-org-name="{{jsesc Name no_quote}}" data-vw-billing-email="{{jsesc BillingEmail no_quote}}">Delete Organization</button><br>
</td>
</tr>
{{/each}}
diff --git a/src/static/templates/admin/users.hbs b/src/static/templates/admin/users.hbs
index 744d9fb2..9d9c684d 100644
--- a/src/static/templates/admin/users.hbs
+++ b/src/static/templates/admin/users.hbs
@@ -8,7 +8,7 @@
<th class="vw-account-details">User</th>
<th class="vw-created-at">Created at</th>
<th class="vw-last-active">Last Active</th>
- <th class="vw-items">Items</th>
+ <th class="vw-ciphers">Ciphers</th>
<th class="vw-attachments">Attachments</th>
<th class="vw-organizations">Organizations</th>
<th class="vw-actions">Actions</th>
@@ -63,14 +63,14 @@
<td class="text-end px-0 small">
<span data-vw-user-uuid="{{jsesc Id no_quote}}" data-vw-user-email="{{jsesc Email no_quote}}">
{{#if TwoFactorEnabled}}
- <button type="button" class="btn btn-sm btn-link p-0 border-0 float-right" vw-remove2fa>Remove all 2FA</button>
+ <button type="button" class="btn btn-sm btn-link p-0 border-0 float-right" vw-remove2fa>Remove all 2FA</button><br>
{{/if}}
- <button type="button" class="btn btn-sm btn-link p-0 border-0 float-right" vw-deauth-user>Deauthorize sessions</button>
- <button type="button" class="btn btn-sm btn-link p-0 border-0 float-right" vw-delete-user>Delete User</button>
+ <button type="button" class="btn btn-sm btn-link p-0 border-0 float-right" vw-deauth-user>Deauthorize sessions</button><br>
+ <button type="button" class="btn btn-sm btn-link p-0 border-0 float-right" vw-delete-user>Delete User</button><br>
{{#if user_enabled}}
- <button type="button" class="btn btn-sm btn-link p-0 border-0 float-right" vw-disable-user>Disable User</button>
+ <button type="button" class="btn btn-sm btn-link p-0 border-0 float-right" vw-disable-user>Disable User</button><br>
{{else}}
- <button type="button" class="btn btn-sm btn-link p-0 border-0 float-right" vw-enable-user>Enable User</button>
+ <button type="button" class="btn btn-sm btn-link p-0 border-0 float-right" vw-enable-user>Enable User</button><br>
{{/if}}
</span>
</td>