2017-05-17 01:20:58 +08:00
< ? php
2017-05-30 03:51:06 +08:00
require_once $_SERVER [ 'DOCUMENT_ROOT' ] . '/modals/footer.php' ;
2018-08-04 02:31:33 +08:00
logger ();
2017-05-17 01:20:58 +08:00
?>
< div style = " margin-bottom: 100px; " ></ div >
2019-10-21 03:25:58 +08:00
< ? php
$hash = $js_minifier -> getDataHash ();
$JSPath = '/tmp/' . $hash . '.js' ;
if ( ! file_exists ( $JSPath )) {
$js_minifier -> minify ( $JSPath );
cleanupJS ( $hash );
}
?>
< script src = " /cache/<?=basename( $JSPath )?> " ></ script >
2017-05-17 01:20:58 +08:00
< script >
2018-09-10 03:17:59 +08:00
< ? php
$lang_footer = json_encode ( $lang [ 'footer' ]);
$lang_acl = json_encode ( $lang [ 'acl' ]);
$lang_tfa = json_encode ( $lang [ 'tfa' ]);
echo " var lang_footer = " . $lang_footer . " ; \n " ;
echo " var lang_acl = " . $lang_acl . " ; \n " ;
echo " var lang_tfa = " . $lang_tfa . " ; \n " ;
echo " var docker_timeout = " . $DOCKER_TIMEOUT * 1000 . " ; \n " ;
?>
2017-10-21 16:07:06 +08:00
$ ( window ) . scroll ( function () {
sessionStorage . scrollTop = $ ( this ) . scrollTop ();
});
2017-05-17 01:20:58 +08:00
// Select language and reopen active URL without POST
function setLang ( sel ) {
$ . post ( " <?= $_SERVER['REQUEST_URI'] ; ?> " , { lang : sel } );
window . location . href = window . location . pathname + window . location . search ;
}
2018-08-04 02:31:33 +08:00
$ ( window ) . load ( function () {
2018-01-25 20:22:17 +08:00
$ ( " .overlay " ) . hide ();
});
2017-05-17 01:20:58 +08:00
$ ( document ) . ready ( function () {
2019-03-25 19:33:58 +08:00
$ ( document ) . on ( 'shown.bs.modal' , function ( e ) {
modal_id = $ ( e . relatedTarget ) . data ( 'target' );
$ ( modal_id ) . attr ( " aria-hidden " , " false " );
});
2018-09-10 03:17:59 +08:00
// TFA, CSRF, Alerts in footer.inc.php
// Other general functions in mailcow.js
2018-08-04 02:31:33 +08:00
< ? php
$alertbox_log_parser = alertbox_log_parser ( $_SESSION );
if ( is_array ( $alertbox_log_parser )) {
2018-08-14 05:20:40 +08:00
foreach ( $alertbox_log_parser as $log ) {
2018-08-04 02:31:33 +08:00
?>
2018-08-14 05:20:40 +08:00
mailcow_alert_box ( < ? = $log [ 'msg' ]; ?> , <?=$log['type'];?>);
2018-08-04 02:31:33 +08:00
< ? php
2018-08-14 05:20:40 +08:00
}
2018-08-04 02:31:33 +08:00
unset ( $_SESSION [ 'return' ]);
}
?>
2017-05-17 01:20:58 +08:00
// Confirm TFA modal
< ? php if ( isset ( $_SESSION [ 'pending_tfa_method' ])) : ?>
$ ( '#ConfirmTFAModal' ) . modal ({
backdrop : 'static' ,
keyboard : false
});
2019-09-25 00:34:08 +08:00
$ ( '#u2f_status_auth' ) . html ( '<p><span class="glyphicon glyphicon-refresh glyphicon-spin"></span> ' + lang_tfa . init_u2f + '</p>' );
2017-05-17 01:20:58 +08:00
$ ( '#ConfirmTFAModal' ) . on ( 'shown.bs.modal' , function (){
[Docker API] Use TLS encryption for communication with "on-the-fly" created key paris (non-exposed)
[Docker API] Create pipe to pass Rspamd UI worker password
[Dovecot] Pull Spamassassin ruleset to be read by Rspamd (MANY THANKS to Peer Heinlein!)
[Dovecot] Garbage collector for deleted maildirs (set keep time via MAILDIR_GC_TIME which defaults to 1440 minutes)
[Web] Flush memcached after mailbox item changes, fixes #1808
[Web] Fix duplicate IDs, fixes #1792
[Compose] Use SQL sockets
[PHP-FPM] Update APCu and Redis libs
[Dovecot] Encrypt maildir with global key pair in crypt-vol-1 (BACKUP!), also fixes #1791
[Web] Fix deletion of spam aliases
[Helper] Add "crypt" to backup script
[Helper] Override file for external SQL socket (not supported!)
[Compose] New images for Rspamd, PHP-FPM, SOGo, Dovecot, Docker API, Watchdog, ACME, Postfix
2018-09-30 04:01:23 +08:00
$ ( this ) . find ( 'input[name=token]' ) . focus ();
2017-05-17 01:20:58 +08:00
// If U2F
if ( document . getElementById ( " u2f_auth_data " ) !== null ) {
$ . ajax ({
type : " GET " ,
cache : false ,
dataType : 'script' ,
2018-02-11 05:42:46 +08:00
url : " /api/v1/get/u2f-authentication/<?= (isset( $_SESSION['pending_mailcow_cc_username'] )) ? rawurlencode( $_SESSION['pending_mailcow_cc_username'] ) : null; ?> " ,
2017-11-21 16:33:22 +08:00
complete : function ( data ){
2018-09-10 03:17:59 +08:00
$ ( '#u2f_status_auth' ) . html ( lang_tfa . waiting_usb_auth );
2017-05-17 01:20:58 +08:00
data ;
2017-11-21 16:33:22 +08:00
setTimeout ( function () {
console . log ( " Ready to authenticate " );
u2f . sign ( appId , challenge , registeredKeys , function ( data ) {
var form = document . getElementById ( 'u2f_auth_form' );
var auth = document . getElementById ( 'u2f_auth_data' );
console . log ( " Authenticate callback " , data );
auth . value = JSON . stringify ( data );
form . submit ();
});
}, 1000 );
2017-05-17 01:20:58 +08:00
}
});
}
});
2018-02-17 05:39:33 +08:00
$ ( '#ConfirmTFAModal' ) . on ( 'hidden.bs.modal' , function (){
$ . ajax ({
type : " GET " ,
cache : false ,
dataType : 'script' ,
url : '/inc/ajax/destroy_tfa_auth.php' ,
complete : function ( data ){
window . location = window . location . href . split ( " # " )[ 0 ];
}
});
});
2017-05-17 01:20:58 +08:00
< ? php endif ; ?>
// Set TFA modals
$ ( '#selectTFA' ) . change ( function () {
if ( $ ( this ) . val () == " yubi_otp " ) {
$ ( '#YubiOTPModal' ) . modal ( 'show' );
$ ( " option:selected " ) . prop ( " selected " , false );
}
if ( $ ( this ) . val () == " totp " ) {
$ ( '#TOTPModal' ) . modal ( 'show' );
2019-03-19 15:45:08 +08:00
request_token = $ ( '#tfa-qr-img' ) . data ( 'totp-secret' );
$ . ajax ({
url : '/inc/ajax/qr_gen.php' ,
data : {
token : request_token ,
},
}) . done ( function ( result ) {
$ ( " #tfa-qr-img " ) . attr ( " src " , result );
});
2017-05-17 01:20:58 +08:00
$ ( " option:selected " ) . prop ( " selected " , false );
}
if ( $ ( this ) . val () == " u2f " ) {
$ ( '#U2FModal' ) . modal ( 'show' );
$ ( " option:selected " ) . prop ( " selected " , false );
2019-09-25 00:34:08 +08:00
$ ( " #start_u2f_register " ) . click ( function (){
$ ( '#u2f_return_code' ) . html ( '' );
$ ( '#u2f_return_code' ) . hide ();
$ ( '#u2f_status_reg' ) . html ( '<p><span class="glyphicon glyphicon-refresh glyphicon-spin"></span> ' + lang_tfa . init_u2f + '</p>' );
$ . ajax ({
type : " GET " ,
cache : false ,
dataType : 'script' ,
url : " /api/v1/get/u2f-registration/<?= (isset( $_SESSION['mailcow_cc_username'] )) ? rawurlencode( $_SESSION['mailcow_cc_username'] ) : null; ?> " ,
complete : function ( data ){
data ;
setTimeout ( function () {
console . log ( " Ready to register " );
$ ( '#u2f_status_reg' ) . html ( lang_tfa . waiting_usb_register );
u2f . register ( appId , registerRequests , registeredKeys , function ( deviceResponse ) {
var form = document . getElementById ( 'u2f_reg_form' );
var reg = document . getElementById ( 'u2f_register_data' );
console . log ( " Register callback: " , data );
if ( deviceResponse . errorCode && deviceResponse . errorCode != 0 ) {
var u2f_return_code = document . getElementById ( 'u2f_return_code' );
u2f_return_code . style . display = u2f_return_code . style . display === 'none' ? '' : null ;
if ( deviceResponse . errorCode == " 4 " ) {
deviceResponse . errorCode = " 4 - The presented device is not eligible for this request. For a registration request this may mean that the token is already registered, and for a sign request it may mean that the token does not know the presented key handle " ;
}
else if ( deviceResponse . errorCode == " 5 " ) {
deviceResponse . errorCode = " 5 - Timeout reached before request could be satisfied. " ;
}
u2f_return_code . innerHTML = lang_tfa . error_code + ': ' + deviceResponse . errorCode + ' ' + lang_tfa . reload_retry ;
return ;
}
reg . value = JSON . stringify ( deviceResponse );
form . submit ();
});
}, 1000 );
}
});
2017-05-17 01:20:58 +08:00
});
}
if ( $ ( this ) . val () == " none " ) {
$ ( '#DisableTFAModal' ) . modal ( 'show' );
$ ( " option:selected " ) . prop ( " selected " , false );
}
});
2019-09-22 21:10:56 +08:00
// Reload after session timeout
var session_lifetime = < ? = ( intval ( $SESSION_LIFETIME ) * 1000 ) + 15000 ; ?> ;
< ? php
if ( isset ( $_SESSION [ 'mailcow_cc_username' ])) :
?>
setTimeout ( function () {
location . reload ();
}, session_lifetime );
< ? php
endif ;
?>
2017-05-17 01:20:58 +08:00
// CSRF
[Docker API] Use TLS encryption for communication with "on-the-fly" created key paris (non-exposed)
[Docker API] Create pipe to pass Rspamd UI worker password
[Dovecot] Pull Spamassassin ruleset to be read by Rspamd (MANY THANKS to Peer Heinlein!)
[Dovecot] Garbage collector for deleted maildirs (set keep time via MAILDIR_GC_TIME which defaults to 1440 minutes)
[Web] Flush memcached after mailbox item changes, fixes #1808
[Web] Fix duplicate IDs, fixes #1792
[Compose] Use SQL sockets
[PHP-FPM] Update APCu and Redis libs
[Dovecot] Encrypt maildir with global key pair in crypt-vol-1 (BACKUP!), also fixes #1791
[Web] Fix deletion of spam aliases
[Helper] Add "crypt" to backup script
[Helper] Override file for external SQL socket (not supported!)
[Compose] New images for Rspamd, PHP-FPM, SOGo, Dovecot, Docker API, Watchdog, ACME, Postfix
2018-09-30 04:01:23 +08:00
$ ( '<input type="hidden" value="<?= $_SESSION[' CSRF '][' TOKEN ']; ?>">' ) . attr ( 'name' , 'csrf_token' ) . appendTo ( 'form' );
2017-10-21 16:07:06 +08:00
if ( sessionStorage . scrollTop != " undefined " ) {
$ ( window ) . scrollTop ( sessionStorage . scrollTop );
}
2017-05-17 01:20:58 +08:00
});
</ script >
2019-09-29 02:00:04 +08:00
< ? php
2019-10-03 01:00:36 +08:00
if ( ! empty ( $UI_TEXTS [ 'ui_footer' ])) :
2019-09-29 02:00:04 +08:00
?>
< div class = " container " style = " margin-bottom:20px;color:#959595; " >
< hr >
2019-10-03 01:00:36 +08:00
< ? = $UI_TEXTS [ 'ui_footer' ]; ?>
2019-09-29 02:00:04 +08:00
</ div >
< ? php
endif ;
?>
2017-05-17 01:20:58 +08:00
</ body >
</ html >
< ? php
$stmt = null ;
2017-12-09 20:17:15 +08:00
$pdo = null ;