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 >
2017-05-30 03:51:06 +08:00
< script src = " /js/bootstrap.min.js " ></ script >
2017-05-17 01:20:58 +08:00
< script src = " /js/bootstrap-switch.min.js " ></ script >
< script src = " /js/bootstrap-slider.min.js " ></ script >
< script src = " /js/bootstrap-select.min.js " ></ script >
2017-10-21 16:07:06 +08:00
< script src = " /js/bootstrap-filestyle.min.js " ></ script >
2017-05-17 01:20:58 +08:00
< script src = " /js/notifications.min.js " ></ script >
2017-12-09 20:17:15 +08:00
< script src = " /js/formcache.min.js " ></ script >
2018-07-24 18:46:17 +08:00
< script src = " /js/google.charts.loader.js " ></ script >
2017-11-04 03:37:24 +08:00
< script src = " /js/numberedtextarea.min.js " ></ script >
2018-09-10 03:17:59 +08:00
< script src = " /js/sha1.min.js " ></ script >
2017-05-17 01:20:58 +08:00
< script src = " /js/u2f-api.js " ></ script >
2017-05-23 15:36:59 +08:00
< script src = " /js/api.js " ></ script >
2018-09-10 03:17:59 +08:00
< script src = " /js/mailcow.js " ></ 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 () {
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
});
2017-11-21 16:33:22 +08:00
$ ( '#u2f_status_auth' ) . html ( '<p><span class="glyphicon glyphicon-refresh glyphicon-spin"></span> Initializing, please wait...</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' );
$ ( " option:selected " ) . prop ( " selected " , false );
}
if ( $ ( this ) . val () == " u2f " ) {
$ ( '#U2FModal' ) . modal ( 'show' );
$ ( " option:selected " ) . prop ( " selected " , false );
2017-11-21 16:33:22 +08:00
$ ( '#u2f_status_reg' ) . html ( '<p><span class="glyphicon glyphicon-refresh glyphicon-spin"></span> Initializing, please wait...</p>' );
2017-05-17 01:20:58 +08:00
$ . ajax ({
type : " GET " ,
cache : false ,
dataType : 'script' ,
2018-02-11 05:42:46 +08:00
url : " /api/v1/get/u2f-registration/<?= (isset( $_SESSION['mailcow_cc_username'] )) ? rawurlencode( $_SESSION['mailcow_cc_username'] ) : null; ?> " ,
2017-11-21 16:33:22 +08:00
complete : function ( data ){
2017-05-17 01:20:58 +08:00
data ;
2017-11-21 16:33:22 +08:00
setTimeout ( function () {
console . log ( " Ready to register " );
2018-09-10 03:17:59 +08:00
$ ( '#u2f_status_reg' ) . html ( lang_tfa . waiting_usb_register );
2017-11-21 16:33:22 +08:00
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 " ; }
u2f_return_code . innerHTML = 'Error code: ' + deviceResponse . errorCode ;
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 );
}
});
// 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 >
</ body >
</ html >
< ? php
$stmt = null ;
2017-12-09 20:17:15 +08:00
$pdo = null ;