mirror of
https://github.com/outbackdingo/labca.git
synced 2026-01-27 10:19:34 +00:00
When in lockdown mode, only those domains can be used to request certificates for, but it also only accepts email addresses in those domains. With this option in the GUI it is now possible to still allow all public domains in contact addresses.
508 lines
18 KiB
JavaScript
508 lines
18 KiB
JavaScript
function positionFooter() {
|
|
var page = $("div#page-wrapper");
|
|
$("#footer").parent().css("padding-top", "0px");
|
|
var usedHeight = 0;
|
|
page.children().each(function() {
|
|
usedHeight += $(this).outerHeight();
|
|
});
|
|
var offset = page.outerHeight() - usedHeight - 2;
|
|
if (offset < 0 ) {
|
|
offset = 0;
|
|
}
|
|
$("#footer").parent().css("padding-top", offset + "px");
|
|
}
|
|
|
|
$(function() {
|
|
if ( $.fn.dataTable) {
|
|
$.fn.dataTable.render.ellipsis = function ( cutoff, wordbreak, escapeHtml ) {
|
|
var esc = function ( t ) {
|
|
return t
|
|
.replace( /&/g, '&' )
|
|
.replace( /</g, '<' )
|
|
.replace( />/g, '>' )
|
|
.replace( /"/g, '"' );
|
|
};
|
|
|
|
return function ( d, type, row ) {
|
|
// Order, search and type get the original data
|
|
if ( type !== 'display' ) {
|
|
return d;
|
|
}
|
|
|
|
if ( typeof d !== 'number' && typeof d !== 'string' ) {
|
|
return d;
|
|
}
|
|
|
|
d = d.toString(); // cast numbers
|
|
|
|
if ( d.length < cutoff ) {
|
|
return d;
|
|
}
|
|
|
|
var shortened = d.substr(0, cutoff-1);
|
|
|
|
// Find the last white space character in the string
|
|
if ( wordbreak ) {
|
|
shortened = shortened.replace(/\s([^\s]*)$/, '');
|
|
}
|
|
|
|
// Protect against uncontrolled HTML input
|
|
if ( escapeHtml ) {
|
|
shortened = esc( shortened );
|
|
}
|
|
|
|
return '<span class="ellipsis" title="'+esc(d)+'">'+shortened+'…</span>';
|
|
};
|
|
};
|
|
|
|
/*
|
|
* Natural Sort algorithm for Javascript - Version 0.7 - Released under MIT license
|
|
* Author: Jim Palmer (based on chunking idea from Dave Koelle)
|
|
* Contributors: Mike Grier (mgrier.com), Clint Priest, Kyle Adams, guillermo
|
|
* See: http://js-naturalsort.googlecode.com/svn/trunk/naturalSort.js
|
|
*/
|
|
function naturalSort (a, b, html) {
|
|
var re = /(^-?[0-9]+(\.?[0-9]*)[df]?e?[0-9]?%?$|^0x[0-9a-f]+$|[0-9]+)/gi,
|
|
sre = /(^[ ]*|[ ]*$)/g,
|
|
dre = /(^([\w ]+,?[\w ]+)?[\w ]+,?[\w ]+\d+:\d+(:\d+)?[\w ]?|^\d{1,4}[\/\-]\d{1,4}[\/\-]\d{1,4}|^\w+, \w+ \d+, \d{4})/,
|
|
hre = /^0x[0-9a-f]+$/i,
|
|
ore = /^0/,
|
|
htmre = /(<([^>]+)>)/ig,
|
|
// convert all to strings and trim()
|
|
x = a.toString().replace(sre, '') || '',
|
|
y = b.toString().replace(sre, '') || '';
|
|
// remove html from strings if desired
|
|
if (!html) {
|
|
x = x.replace(htmre, '');
|
|
y = y.replace(htmre, '');
|
|
}
|
|
// chunk/tokenize
|
|
var xN = x.replace(re, '\0$1\0').replace(/\0$/,'').replace(/^\0/,'').split('\0'),
|
|
yN = y.replace(re, '\0$1\0').replace(/\0$/,'').replace(/^\0/,'').split('\0'),
|
|
// numeric, hex or date detection
|
|
xD = parseInt(x.match(hre), 10) || (xN.length !== 1 && x.match(dre) && Date.parse(x)),
|
|
yD = parseInt(y.match(hre), 10) || xD && y.match(dre) && Date.parse(y) || null;
|
|
|
|
// first try and sort Hex codes or Dates
|
|
if (yD) {
|
|
if ( xD < yD ) {
|
|
return -1;
|
|
}
|
|
else if ( xD > yD ) {
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
// natural sorting through split numeric strings and default strings
|
|
for(var cLoc=0, numS=Math.max(xN.length, yN.length); cLoc < numS; cLoc++) {
|
|
// find floats not starting with '0', string or 0 if not defined (Clint Priest)
|
|
var oFxNcL = !(xN[cLoc] || '').match(ore) && parseFloat(xN[cLoc], 10) || xN[cLoc] || 0;
|
|
var oFyNcL = !(yN[cLoc] || '').match(ore) && parseFloat(yN[cLoc], 10) || yN[cLoc] || 0;
|
|
// handle numeric vs string comparison - number < string - (Kyle Adams)
|
|
if (isNaN(oFxNcL) !== isNaN(oFyNcL)) {
|
|
return (isNaN(oFxNcL)) ? 1 : -1;
|
|
}
|
|
// rely on string comparison if different types - i.e. '02' < 2 != '02' < '2'
|
|
else if (typeof oFxNcL !== typeof oFyNcL) {
|
|
oFxNcL += '';
|
|
oFyNcL += '';
|
|
}
|
|
if (oFxNcL < oFyNcL) {
|
|
return -1;
|
|
}
|
|
if (oFxNcL > oFyNcL) {
|
|
return 1;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
jQuery.extend( jQuery.fn.dataTableExt.oSort, {
|
|
"natural-asc": function ( a, b ) {
|
|
return naturalSort(a,b,true);
|
|
},
|
|
|
|
"natural-desc": function ( a, b ) {
|
|
return naturalSort(a,b,true) * -1;
|
|
},
|
|
|
|
"natural-nohtml-asc": function( a, b ) {
|
|
return naturalSort(a,b,false);
|
|
},
|
|
|
|
"natural-nohtml-desc": function( a, b ) {
|
|
return naturalSort(a,b,false) * -1;
|
|
},
|
|
|
|
"natural-ci-asc": function( a, b ) {
|
|
a = a.toString().toLowerCase();
|
|
b = b.toString().toLowerCase();
|
|
|
|
return naturalSort(a,b,true);
|
|
},
|
|
|
|
"natural-ci-desc": function( a, b ) {
|
|
a = a.toString().toLowerCase();
|
|
b = b.toString().toLowerCase();
|
|
|
|
return naturalSort(a,b,true) * -1;
|
|
}
|
|
} );
|
|
}
|
|
|
|
$('#o').blur(function() {
|
|
var prefix = $(this).val().split(" ")[0];
|
|
|
|
if ((prefix != "") && (($("#cn").val() == "Root CA") || ($("#cn").val() == "CA")) && ($(this).parent().parent().find(".error").length == 1)) {
|
|
$("#cn").val(prefix + " " + $("#cn").val());
|
|
}
|
|
});
|
|
|
|
function radioDisable() {
|
|
$("input[type=radio]").each(function() {
|
|
$("#" + $(this).attr('id') + "_domains").prop('readonly', !$(this).prop('checked'));
|
|
});
|
|
|
|
if ($("input[type=radio]#whitelist").prop('checked') || $("input[type=radio]#standard").prop('checked') ) {
|
|
$("#domain_mode_warning").show();
|
|
$("#ld_options").hide();
|
|
} else {
|
|
$("#domain_mode_warning").hide();
|
|
$("#ld_options").show();
|
|
}
|
|
}
|
|
|
|
$("input[type=radio]").change(function() {
|
|
radioDisable();
|
|
});
|
|
|
|
$("#domain_mode_warning").hide();
|
|
$("#ld_options").show();
|
|
radioDisable();
|
|
|
|
|
|
$( window ).resize(function() {
|
|
positionFooter();
|
|
});
|
|
|
|
$("#restart-button").click(function(evt) {
|
|
$("#pre-restart-1").hide();
|
|
$("#pre-restart-2").hide();
|
|
$("#restarting").removeClass("hidden");
|
|
$("#restarting").show();
|
|
$(window).resize();
|
|
|
|
var args = [ "unknown" ];
|
|
if (window.location.href.indexOf('?') > 0 ) {
|
|
var tmp = window.location.href.split('?');
|
|
if (tmp.length > 1) {
|
|
args = tmp[1].split('=');
|
|
}
|
|
}
|
|
var secret = "";
|
|
var nextPath = "";
|
|
if (args[0] == "restart") {
|
|
secret = args[1];
|
|
nextPath = "/restart";
|
|
}
|
|
|
|
var pollTimer;
|
|
|
|
var baseUrl = window.location.href;
|
|
if (baseUrl.indexOf("?") > 0) {
|
|
baseUrl = baseUrl.substr(0, baseUrl.indexOf("?"));
|
|
}
|
|
if (baseUrl.endsWith("/wait")) {
|
|
baseUrl = baseUrl.substr(0, baseUrl.length-5);
|
|
}
|
|
$.ajax(baseUrl + nextPath, {
|
|
data: {
|
|
token: secret,
|
|
},
|
|
timeout: 30000
|
|
})
|
|
.done(function(data) {
|
|
clearInterval(pollTimer);
|
|
window.location.href = baseUrl + "/setup";
|
|
})
|
|
.fail(function(xhr, status, err) {
|
|
nextPath = "";
|
|
// Assume that the restart was initiated... Wait for server to be available again.
|
|
var ctr = 0;
|
|
pollTimer = setInterval(pollServer, 3000);
|
|
|
|
function pollServer() {
|
|
if (ctr > 59) {
|
|
clearInterval(pollTimer);
|
|
$("img#restart-spinner").parent().text("timeout").addClass("error");
|
|
} else if (ctr < 10) {
|
|
// No need to try immediately, the server is restarting
|
|
ctr++;
|
|
} else {
|
|
$.ajax(baseUrl + nextPath, {
|
|
timeout: 2500
|
|
})
|
|
.done(function(data) {
|
|
clearInterval(pollTimer);
|
|
window.location.href = baseUrl;
|
|
})
|
|
.fail(function(xhr, status, err) {
|
|
ctr++;
|
|
if ((typeof err === 'undefined' || err === "") && status === "error") {
|
|
// Probably because the certificate has changed
|
|
clearInterval(pollTimer);
|
|
window.location.href = baseUrl;
|
|
}
|
|
});
|
|
}
|
|
}
|
|
});
|
|
|
|
return false;
|
|
});
|
|
|
|
if ( $("img#wrapup-spinner").length ) {
|
|
var targetUrl = window.location.href.replace("/setup", "/final");
|
|
var ctr = 0;
|
|
var pollTimer = setInterval(pollServer, 5000);
|
|
|
|
function pollServer() {
|
|
if (ctr > 60) {
|
|
clearInterval(pollTimer);
|
|
$("img#wrapup-spinner").parent().text("timeout").addClass("error");
|
|
} else if (ctr < 5) {
|
|
// No need to try immediately, the server won't be ready this quick
|
|
ctr++;
|
|
} else {
|
|
$.ajax(targetUrl, {
|
|
timeout: 4500
|
|
})
|
|
.done(function(data) {
|
|
if (data.error) {
|
|
clearInterval(pollTimer);
|
|
targetUrl = targetUrl.replace("/final", "/error");
|
|
window.location.href = targetUrl;
|
|
} else if (data.complete) {
|
|
clearInterval(pollTimer);
|
|
targetUrl = targetUrl.replace("/final", "");
|
|
window.location.href = targetUrl;
|
|
}
|
|
})
|
|
.fail(function(xhr, status, err) {
|
|
ctr++;
|
|
if ((typeof err === 'undefined' || err === "") && status === "error") {
|
|
// Probably because the certificate has changed
|
|
clearInterval(pollTimer);
|
|
window.location.href = targetUrl;
|
|
}
|
|
});
|
|
}
|
|
}
|
|
}
|
|
|
|
$("#cert-revoke-btn").click(function(evt) {
|
|
if ( $("#revoke-reason").val() == "" ) {
|
|
alert("You must select a reason");
|
|
} else {
|
|
$.ajax(window.location.href, {
|
|
method: "POST",
|
|
data: {
|
|
serial: $("#revoke-serial").val(),
|
|
reason: $("#revoke-reason").val(),
|
|
},
|
|
})
|
|
.done(function(data) {
|
|
window.location.reload();
|
|
})
|
|
.fail(function(xhr, status, err) {
|
|
alert(err);
|
|
window.location.href = window.location.href + "/../../logs/labca";
|
|
});
|
|
}
|
|
});
|
|
|
|
$("#use-https").click(function(evt) {
|
|
$("#acme-server").prop('readonly', !$(this).prop('checked'));
|
|
});
|
|
$("#acme-server").prop('readonly', !$("#use-https").prop('checked'));
|
|
|
|
$(document).ready(function() {
|
|
if ( $(".datatable").length ) {
|
|
var options = {
|
|
pageLength: 25,
|
|
};
|
|
|
|
if ( $('.orders_list').length || $('.rel_orders_list').length ) {
|
|
col = 2;
|
|
if ( $('.backend_stepca').length ) {
|
|
col = 1;
|
|
}
|
|
options["columnDefs"] = [ {
|
|
targets: col,
|
|
render: $.fn.dataTable.render.ellipsis(15)
|
|
} ];
|
|
}
|
|
|
|
if ( $('.certificates_list').length || $('.rel_certificates_list').length ) {
|
|
col = 2;
|
|
if ( $('.backend_stepca').length ) {
|
|
col = 1;
|
|
}
|
|
options["columnDefs"] = [ {
|
|
targets: col,
|
|
render: $.fn.dataTable.render.ellipsis(15)
|
|
} ];
|
|
}
|
|
|
|
if ( $('.authz_list').length || $('.rel_authz_list').length ) {
|
|
if ( $('.backend_stepca').length ) {
|
|
options["columnDefs"] = [
|
|
{
|
|
targets: 1,
|
|
render: $.fn.dataTable.render.ellipsis(15),
|
|
},
|
|
];
|
|
} else {
|
|
options["columnDefs"] = [
|
|
{
|
|
targets: 0,
|
|
render: $.fn.dataTable.render.ellipsis(15),
|
|
type: 'natural'
|
|
},
|
|
];
|
|
}
|
|
}
|
|
|
|
if ( $('.challenges_list').length || $('.rel_challenges_list').length ) {
|
|
if ( $('.backend_stepca').length ) {
|
|
options["columnDefs"] = [
|
|
{
|
|
targets: 1,
|
|
render: $.fn.dataTable.render.ellipsis(15)
|
|
},
|
|
];
|
|
} else {
|
|
options["columnDefs"] = [
|
|
{
|
|
targets: 1,
|
|
render: $.fn.dataTable.render.ellipsis(15)
|
|
},
|
|
{
|
|
targets: 5,
|
|
render: $.fn.dataTable.render.ellipsis(15)
|
|
}
|
|
];
|
|
}
|
|
}
|
|
|
|
var table = $(".datatable").DataTable( options );
|
|
|
|
$('.accounts_list tbody').on('click', 'tr', function () {
|
|
var data = table.row( this ).data();
|
|
window.location = window.location + '/' + data[0]
|
|
});
|
|
|
|
$('.orders_list tbody').on('click', 'tr', function () {
|
|
var data = table.row( this ).data();
|
|
window.location = window.location + '/' + data[0]
|
|
});
|
|
|
|
$('.rel_orders_list tbody').on('click', 'tr', function () {
|
|
var data = table.row( this ).data();
|
|
window.location = window.location + '/../../orders/' + data[0]
|
|
});
|
|
|
|
$('.authz_list tbody').on('click', 'tr', function () {
|
|
var data = table.row( this ).data();
|
|
window.location = window.location + '/' + data[0]
|
|
});
|
|
|
|
$('.rel_authz_list tbody').on('click', 'tr', function () {
|
|
var data = table.row( this ).data();
|
|
window.location = window.location + '/../../authz/' + data[0]
|
|
});
|
|
|
|
$('.challenges_list tbody').on('click', 'tr', function () {
|
|
var data = table.row( this ).data();
|
|
window.location = window.location + '/' + data[0]
|
|
});
|
|
|
|
$('.rel_challenges_list tbody').on('click', 'tr', function () {
|
|
var data = table.row( this ).data();
|
|
window.location = window.location + '/../../challenges/' + data[0]
|
|
});
|
|
|
|
$('.certificates_list tbody').on('click', 'tr', function () {
|
|
var data = table.row( this ).data();
|
|
window.location = window.location.href.split('?')[0] + '/' + data[0]
|
|
});
|
|
|
|
$('.rel_certificates_list tbody').on('click', 'tr', function () {
|
|
var data = table.row( this ).data();
|
|
if (data) {
|
|
window.location = window.location + '/../../certificates/' + data[0]
|
|
}
|
|
});
|
|
|
|
$('.auth_show tbody tr').children().each(function () {
|
|
if (this.textContent == 'Validation Error' || this.textContent == 'Validation Record') {
|
|
console.log(this.nextElementSibling);
|
|
this.nextElementSibling.innerText = JSON.stringify(JSON.parse(this.nextElementSibling.innerText), null, 2);
|
|
$(this.nextElementSibling).wrapInner('<pre class="json"></pre>');
|
|
}
|
|
});
|
|
|
|
$(".datatable").on('draw.dt', positionFooter);
|
|
}
|
|
|
|
$(".datatable").each(function(idx, val) {
|
|
var table = $(val).DataTable();
|
|
classes = $(val).attr('class').split(" ");
|
|
|
|
if ( classes.indexOf("accounts_list") > -1 ) {
|
|
col = 0;
|
|
if ( classes.indexOf("backend_stepca") > -1 ) {
|
|
col = 3;
|
|
}
|
|
table.columns(col).order( 'desc' ).draw();
|
|
}
|
|
|
|
if ( classes.indexOf("certificates_list") > -1 || classes.indexOf("rel_certificates_list") > -1 ) {
|
|
col = 0;
|
|
if ( classes.indexOf("backend_stepca") > -1 ) {
|
|
col = 5;
|
|
}
|
|
table.columns(col).order( 'desc' ).draw();
|
|
}
|
|
|
|
if ( classes.indexOf("orders_list") > -1 || classes.indexOf("rel_orders_list") > -1 ) {
|
|
col = 0;
|
|
if ( classes.indexOf("backend_stepca") > -1 ) {
|
|
col = 4;
|
|
}
|
|
table.columns(col).order( 'desc' ).draw();
|
|
}
|
|
|
|
if ( classes.indexOf("authz_list") > -1 || classes.indexOf("rel_authz_list") > -1 ) {
|
|
col = 0;
|
|
if ( classes.indexOf("backend_stepca") > -1 ) {
|
|
col = 4;
|
|
}
|
|
table.columns(col).order( 'desc' ).draw();
|
|
}
|
|
|
|
if ( classes.indexOf("challenges_list") > -1 || classes.indexOf("rel_challenges_list") > -1 ) {
|
|
col = 0;
|
|
if ( classes.indexOf("backend_stepca") > -1 ) {
|
|
col = 4;
|
|
}
|
|
table.columns(col).order( 'desc' ).draw();
|
|
}
|
|
});
|
|
|
|
setTimeout(function() {
|
|
$(window).resize();
|
|
}, 10);
|
|
});
|
|
});
|