[Web] New feature: Show DKIM private keys - needs variable set to true in vars.local.inc.php
This commit is contained in:
parent
c6f81fe67b
commit
750a2b8cef
@ -157,6 +157,7 @@ $tfa_data = get_tfa();
|
|||||||
</div>
|
</div>
|
||||||
<div class="col-xs-9">
|
<div class="col-xs-9">
|
||||||
<pre><?=$dkim['dkim_txt'];?></pre>
|
<pre><?=$dkim['dkim_txt'];?></pre>
|
||||||
|
<p data-toggle="modal" data-target="#showDKIMprivKey" id="dkim_priv" style="cursor:pointer;margin-top:-8pt" data-priv-key="<?=$dkim['privkey'];?>"><small>↪ Private key</small></p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<?php
|
<?php
|
||||||
@ -186,6 +187,7 @@ $tfa_data = get_tfa();
|
|||||||
</div>
|
</div>
|
||||||
<div class="col-xs-9">
|
<div class="col-xs-9">
|
||||||
<pre><?=$dkim['dkim_txt'];?></pre>
|
<pre><?=$dkim['dkim_txt'];?></pre>
|
||||||
|
<p data-toggle="modal" data-target="#showDKIMprivKey" id="dkim_priv" style="cursor:pointer;margin-top:-8pt" data-priv-key="<?=$dkim['privkey'];?>"><small>↪ Private key</small></p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<?php
|
<?php
|
||||||
@ -197,7 +199,7 @@ $tfa_data = get_tfa();
|
|||||||
<div class="col-xs-1 col-xs-offset-1">
|
<div class="col-xs-1 col-xs-offset-1">
|
||||||
<p><small>↳ Alias-Domain: <strong><?=htmlspecialchars($alias_domain);?></strong><br /></small><span class="label label-danger"><?=$lang['admin']['dkim_key_missing'];?></span></p>
|
<p><small>↳ Alias-Domain: <strong><?=htmlspecialchars($alias_domain);?></strong><br /></small><span class="label label-danger"><?=$lang['admin']['dkim_key_missing'];?></span></p>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-xs-9"><pre>-</pre></div>
|
<div class="col-xs-9"><pre>-</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<?php
|
<?php
|
||||||
}
|
}
|
||||||
@ -217,6 +219,7 @@ $tfa_data = get_tfa();
|
|||||||
</div>
|
</div>
|
||||||
<div class="col-xs-9">
|
<div class="col-xs-9">
|
||||||
<pre><?=$dkim['dkim_txt'];?></pre>
|
<pre><?=$dkim['dkim_txt'];?></pre>
|
||||||
|
<p data-toggle="modal" data-target="#showDKIMprivKey" id="dkim_priv" style="cursor:pointer;margin-top:-8pt" data-priv-key="<?=$dkim['privkey'];?>"><small>↪ Private key</small></p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<?php
|
<?php
|
||||||
|
@ -187,6 +187,14 @@ function dkim($_action, $_data = null) {
|
|||||||
}
|
}
|
||||||
$dkimdata['dkim_txt'] = 'v=DKIM1;k=rsa;t=s;s=email;p=' . $redis_dkim_key_data;
|
$dkimdata['dkim_txt'] = 'v=DKIM1;k=rsa;t=s;s=email;p=' . $redis_dkim_key_data;
|
||||||
$dkimdata['dkim_selector'] = $redis->hGet('DKIM_SELECTORS', $_data);
|
$dkimdata['dkim_selector'] = $redis->hGet('DKIM_SELECTORS', $_data);
|
||||||
|
$dkimdata['privkey'] = $redis->hGet('DKIM_PRIV_KEYS', $dkimdata['dkim_selector'] . $_data);
|
||||||
|
if ($GLOBALS['SHOW_DKIM_PRIV_KEYS'] === true) {
|
||||||
|
$dkimdata['privkey'] = base64_encode($redis->hGet('DKIM_PRIV_KEYS', $dkimdata['dkim_selector'] . '.' . $_data));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$dkimdata['privkey'] = base64_encode('Please set $SHOW_DKIM_PRIV_KEYS to true to show DKIM private keys.');
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
return $dkimdata;
|
return $dkimdata;
|
||||||
break;
|
break;
|
||||||
|
@ -82,6 +82,9 @@ $DEFAULT_THEME = 'lumen';
|
|||||||
// Password complexity as regular expression
|
// Password complexity as regular expression
|
||||||
$PASSWD_REGEP = '.{4,}';
|
$PASSWD_REGEP = '.{4,}';
|
||||||
|
|
||||||
|
// Show DKIM private keys - false by default
|
||||||
|
$SHOW_DKIM_PRIV_KEYS = false;
|
||||||
|
|
||||||
// mailcow Apps - buttons on login screen
|
// mailcow Apps - buttons on login screen
|
||||||
$MAILCOW_APPS = array(
|
$MAILCOW_APPS = array(
|
||||||
array(
|
array(
|
||||||
|
@ -1,3 +1,96 @@
|
|||||||
|
var Base64 = {
|
||||||
|
_keyStr: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
|
||||||
|
encode: function(e) {
|
||||||
|
var t = "";
|
||||||
|
var n, r, i, s, o, u, a;
|
||||||
|
var f = 0;
|
||||||
|
e = Base64._utf8_encode(e);
|
||||||
|
while (f < e.length) {
|
||||||
|
n = e.charCodeAt(f++);
|
||||||
|
r = e.charCodeAt(f++);
|
||||||
|
i = e.charCodeAt(f++);
|
||||||
|
s = n >> 2;
|
||||||
|
o = (n & 3) << 4 | r >> 4;
|
||||||
|
u = (r & 15) << 2 | i >> 6;
|
||||||
|
a = i & 63;
|
||||||
|
if (isNaN(r)) {
|
||||||
|
u = a = 64
|
||||||
|
} else if (isNaN(i)) {
|
||||||
|
a = 64
|
||||||
|
}
|
||||||
|
t = t + this._keyStr.charAt(s) + this._keyStr.charAt(o) +
|
||||||
|
this._keyStr.charAt(u) + this._keyStr.charAt(a)
|
||||||
|
}
|
||||||
|
return t
|
||||||
|
},
|
||||||
|
decode: function(e) {
|
||||||
|
var t = "";
|
||||||
|
var n, r, i;
|
||||||
|
var s, o, u, a;
|
||||||
|
var f = 0;
|
||||||
|
e = e.replace(/[^A-Za-z0-9\+\/\=]/g, "");
|
||||||
|
while (f < e.length) {
|
||||||
|
s = this._keyStr.indexOf(e.charAt(f++));
|
||||||
|
o = this._keyStr.indexOf(e.charAt(f++));
|
||||||
|
u = this._keyStr.indexOf(e.charAt(f++));
|
||||||
|
a = this._keyStr.indexOf(e.charAt(f++));
|
||||||
|
n = s << 2 | o >> 4;
|
||||||
|
r = (o & 15) << 4 | u >> 2;
|
||||||
|
i = (u & 3) << 6 | a;
|
||||||
|
t = t + String.fromCharCode(n);
|
||||||
|
if (u != 64) {
|
||||||
|
t = t + String.fromCharCode(r)
|
||||||
|
}
|
||||||
|
if (a != 64) {
|
||||||
|
t = t + String.fromCharCode(i)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
t = Base64._utf8_decode(t);
|
||||||
|
return t
|
||||||
|
},
|
||||||
|
_utf8_encode: function(e) {
|
||||||
|
e = e.replace(/\r\n/g, "\n");
|
||||||
|
var t = "";
|
||||||
|
for (var n = 0; n < e.length; n++) {
|
||||||
|
var r = e.charCodeAt(n);
|
||||||
|
if (r < 128) {
|
||||||
|
t += String.fromCharCode(r)
|
||||||
|
} else if (r > 127 && r < 2048) {
|
||||||
|
t += String.fromCharCode(r >> 6 | 192);
|
||||||
|
t += String.fromCharCode(r & 63 | 128)
|
||||||
|
} else {
|
||||||
|
t += String.fromCharCode(r >> 12 | 224);
|
||||||
|
t += String.fromCharCode(r >> 6 & 63 | 128);
|
||||||
|
t += String.fromCharCode(r & 63 | 128)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return t
|
||||||
|
},
|
||||||
|
_utf8_decode: function(e) {
|
||||||
|
var t = "";
|
||||||
|
var n = 0;
|
||||||
|
var r = c1 = c2 = 0;
|
||||||
|
while (n < e.length) {
|
||||||
|
r = e.charCodeAt(n);
|
||||||
|
if (r < 128) {
|
||||||
|
t += String.fromCharCode(r);
|
||||||
|
n++
|
||||||
|
} else if (r > 191 && r < 224) {
|
||||||
|
c2 = e.charCodeAt(n + 1);
|
||||||
|
t += String.fromCharCode((r & 31) << 6 | c2 & 63);
|
||||||
|
n += 2
|
||||||
|
} else {
|
||||||
|
c2 = e.charCodeAt(n + 1);
|
||||||
|
c3 = e.charCodeAt(n + 2);
|
||||||
|
t += String.fromCharCode((r & 15) << 12 | (c2 & 63) <<
|
||||||
|
6 | c3 & 63);
|
||||||
|
n += 3
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return t
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
jQuery(function($){
|
jQuery(function($){
|
||||||
// http://stackoverflow.com/questions/24816/escaping-html-strings-with-jquery
|
// http://stackoverflow.com/questions/24816/escaping-html-strings-with-jquery
|
||||||
var entityMap = {
|
var entityMap = {
|
||||||
@ -560,6 +653,15 @@ jQuery(function($){
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
$('#showDKIMprivKey').on('show.bs.modal', function (e) {
|
||||||
|
$('#priv_key_pre').text("-");
|
||||||
|
p_related = $(e.relatedTarget)
|
||||||
|
if (p_related != null) {
|
||||||
|
var decoded_key = Base64.decode((p_related.data('priv-key')));
|
||||||
|
$('#priv_key_pre').text(decoded_key);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
$('#test_relayhost').on('click', function (e) {
|
$('#test_relayhost').on('click', function (e) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
prev = $('#test_relayhost').text();
|
prev = $('#test_relayhost').text();
|
||||||
|
@ -91,3 +91,17 @@ if (!isset($_SESSION['mailcow_cc_role'])) {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div><!-- test relayhost modal -->
|
</div><!-- test relayhost modal -->
|
||||||
|
<!-- priv key modal -->
|
||||||
|
<div class="modal fade" id="showDKIMprivKey" tabindex="-1" role="dialog" aria-hidden="true">
|
||||||
|
<div class="modal-dialog">
|
||||||
|
<div class="modal-content">
|
||||||
|
<div class="modal-header">
|
||||||
|
<button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">×</span></button>
|
||||||
|
<h3 class="modal-title"><span class="glyphicon glyphicon-lock"></span> Private key</h3>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body">
|
||||||
|
<pre id="priv_key_pre"></pre>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div><!-- priv key modal -->
|
||||||
|
Loading…
Reference in New Issue
Block a user