whois.handle: JUSAN-MOBILE
whois.name: Jusan Mobile JSC
whois.cidrs: 93.185.65.0/24
whois.created: 2017-04-21T00:00:00.000000
whois.updated: 2021-10-21T00:00:00.000000
whois.handle: ORG-OA9-RIPE
whois.name: Jusan Mobile JSC
whois.address: 69/204 "A", Radostovtsa str.\n050009\nAlmaty\nKAZAKHSTAN
whois.handle: DOIS1-RIPE
whois.name: Department of Information Security
whois.email: y.zifert@kaztranscom.kz
whois.handle: KTC1-RIPE
whois.name: JSC Jusan Mobile
whois.email: noc@jusanmobile.kz
whois.handle: YZ874-RIPE
whois.name: Yevgeniya Zifetr
services.protocol: SMTP
services.transport_protocol: TCP
services.scan_time: 2025-07-27T14:32:12.333143
services.banner: 220-mail.bec.kz ESMTP Postcow
  220 mail.bec.kz ESMTP Postcow
  
services.version_selected: TLSv1_3
services.cipher_selected: TLS_AES_256_GCM_SHA384
services.ja4s: t130200_1302_a56c5b993250
services.names: srv3.bec.kz
services.issuer_dn: C=DE, ST=NRW, L=Willich, O=mailcow, OU=mailcow, CN=srv3.bec.kz
services.common_name: srv3.bec.kz
services.country: DE
services.locality: Willich
services.province: NRW
services.organization: mailcow
services.organizational_unit: mailcow
services.subject_dn: C=DE, ST=NRW, L=Willich, O=mailcow, OU=mailcow, CN=srv3.bec.kz
services.common_name: srv3.bec.kz
services.country: DE
services.locality: Willich
services.province: NRW
services.organization: mailcow
services.organizational_unit: mailcow
services.value: email
services.banner: 220-mail.bec.kz ESMTP Postcow
  220 mail.bec.kz ESMTP Postcow
  
services.ehlo: 250-mail.bec.kz
  250-SIZE 104857600
  250-ETRN
  250-STARTTLS
  250-ENHANCEDSTATUSCODES
  250-8BITMIME
  250 CHUNKING
  
services.start_tls: 220 2.0.0 Ready to start TLS
  
services.protocol: DNS
services.transport_protocol: UDP
services.scan_time: 2025-07-28T03:33:31.849350
services.server_type: FORWARDING
services.name: l.root-servers.net.
services.response: 199.7.83.42
services.type: A
services.name: m.root-servers.net.
services.response: 202.12.27.33
services.type: A
services.name: .
services.response: a.root-servers.net.
services.type: NS
services.name: .
services.response: b.root-servers.net.
services.type: NS
services.name: .
services.response: c.root-servers.net.
services.type: NS
services.name: .
services.response: d.root-servers.net.
services.type: NS
services.name: .
services.response: e.root-servers.net.
services.type: NS
services.name: .
services.response: f.root-servers.net.
services.type: NS
services.name: .
services.response: g.root-servers.net.
services.type: NS
services.name: .
services.response: h.root-servers.net.
services.type: NS
services.name: .
services.response: i.root-servers.net.
services.type: NS
services.name: .
services.response: j.root-servers.net.
services.type: NS
services.name: .
services.response: k.root-servers.net.
services.type: NS
services.name: .
services.response: l.root-servers.net.
services.type: NS
services.name: .
services.response: m.root-servers.net.
services.type: NS
services.name: ip.parrotdns.com.
services.response: ;ip.parrotdns.com.	IN	 A
services.type: A
services.r_code: SUCCESS
services.protocol: HTTP
services.transport_protocol: TCP
services.scan_time: 2025-07-27T20:51:12.998864
services.banner: HTTP/1.1 200 OK
  Server: nginx
  Date:  <REDACTED>
  Content-Type: text/html; charset=utf-8
  Transfer-Encoding: chunked
  Connection: keep-alive
  Vary: Accept-Encoding
  Set-Cookie: PHPSESSID=e8a412f17a9d770260413865af2243df; path=/; HttpOnly
  Expires: Thu, 19 Nov 1981 08:52:00 GMT
  Cache-Control: no-store, no-cache, must-revalidate
  Pragma: no-cache
  Strict-Transport-Security: max-age=15768000;
  X-Content-Type-Options: nosniff
  X-XSS-Protection: 1; mode=block
  X-Robots-Tag: none
  X-Download-Options: noopen
  X-Frame-Options: SAMEORIGIN
  X-Permitted-Cross-Domain-Policies: none
  Referrer-Policy: strict-origin
  Content-Encoding: gzip
  
services.source: OSI_APPLICATION_LAYER
services.part: a
services.vendor: PHP
services.product: PHP
services.cpe: cpe:2.3:a:php:php:*:*:*:*:*:*:*:*
services.source: OSI_APPLICATION_LAYER
services.part: a
services.vendor: nginx
services.product: nginx
services.cpe: cpe:2.3:a:f5:nginx:*:*:*:*:*:*:*:*
services.value: login-page
services.path: /
services.endpoint_type: HTTP
services.scan_time: 2025-07-27T20:51:12.998864
services.uri: http://93.185.65.102/
services.protocol: HTTP/1.1
services.status_reason: OK
services.key: Vary
services.headers: Accept-Encoding
services.key: Transfer-Encoding
services.headers: chunked
services.key: X-Download-Options
services.headers: noopen
services.key: Server
services.headers: nginx
services.key: Strict-Transport-Security
services.headers: max-age=15768000;
services.key: Referrer-Policy
services.headers: strict-origin
services.key: Cache-Control
services.headers: no-store, no-cache, must-revalidate
services.key: X-Content-Type-Options
services.headers: nosniff
services.key: Content-Type
services.headers: text/html; charset=utf-8
services.key: Pragma
services.headers: no-cache
services.key: Date
services.headers: <REDACTED>
services.key: X-Robots-Tag
services.headers: none
services.key: Set-Cookie
services.headers: PHPSESSID=e8a412f17a9d770260413865af2243df; path=/; HttpOnly
services.key: X-Frame-Options
services.headers: SAMEORIGIN
services.key: X-Permitted-Cross-Domain-Policies
services.headers: none
services.key: X-XSS-Protection
services.headers: 1; mode=block
services.key: Expires
services.headers: Thu, 19 Nov 1981 08:52:00 GMT
services.key: Content-Encoding
services.headers: gzip
services.key: Connection
services.headers: keep-alive
services.html_tags: <title>mailcow UI</title> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0"> <meta name="theme-color" content="#F5D76E"/> <meta http-equiv="Referrer-Policy" content="same-origin">
services.body: <!DOCTYPE html>
  <html lang="en-gb">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0">
    <meta name="theme-color" content="#F5D76E"/>
    <meta http-equiv="Referrer-Policy" content="same-origin">
    <title>mailcow UI</title>
  
    <link rel="stylesheet" href="/cache/23c5be9eaf94cb1d3e5c1a698f305e5549eb0c08.css">
    <script>
      // check if darkmode is preferred by OS or set by localStorage
      if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches && localStorage.getItem("theme") !== "light" ||
          localStorage.getItem("theme") === "dark") {
        var head  = document.getElementsByTagName('head')[0];
        var link  = document.createElement('link');
        link.id   = 'dark-mode-theme';
        link.rel  = 'stylesheet';
        link.type = 'text/css';
        link.href = '/css/themes/mailcow-darkmode.css';
        head.appendChild(link);
      }
    </script>
  
    <link rel="shortcut icon" href="/favicon.png" type="image/png">
    <link rel="icon" href="/favicon.png" type="image/png">
  </head>
  <body>
  <div class="overlay"></div>
  
  <form action="/" method="post" id="logout"><input type="hidden" name="logout"></form>
  
  
  <div class="container my-4">
  <div class="row mb-4" style="margin-top: 60px">
    <div class="col-12 col-md-7 col-lg-6 col-xl-5 ms-auto me-auto">
      <div class="card">
        <div class="card-header d-flex align-items-center">
          <i class="bi bi-person-fill me-2"></i> Login
          <div class="ms-auto form-check form-switch my-auto d-flex align-items-center">
            <label class="form-check-label"><i class="bi bi-moon-fill"></i></label>
            <input class="form-check-input ms-2" type="checkbox" id="dark-mode-toggle">
          </div>
        </div>
        <div class="card-body">
          <div class="text-center mailcow-logo mb-4"><img src="/img/cow_mailcow.svg" alt="mailcow"></div>
                  <legend>mailcow UI</legend><hr />
                  <form method="post" autofill="off">
            <div class="d-flex mt-3">
              <label class="visually-hidden" for="login_user">Username</label>
              <div class="input-group">
                <div class="input-group-text"><i class="bi bi-person-fill"></i></div>
                <input name="login_user" autocorrect="off" autocapitalize="none" type="text" id="login_user" class="form-control" placeholder="Username" required="" autofocus="" autocomplete="username">
              </div>
            </div>
            <div class="d-flex mt-3">
              <label class="visually-hidden" for="pass_user">Password</label>
              <div class="input-group">
                <div class="input-group-text"><i class="bi bi-lock-fill"></i></div>
                <input name="pass_user" type="password" id="pass_user" class="form-control" placeholder="Password" required="" autocomplete="current-password">
              </div>
            </div>
            <div class="d-flex mt-4" style="position: relative">
              <button type="submit" class="btn btn-xs-lg btn-success" value="Login">Login</button>
              <button type="button" class="btn btn-xs-lg btn-success ms-2" id="fido2-login"><i class="bi bi-shield-fill-check"></i> FIDO2/WebAuthn Login</button>
                          <button type="button"  class="btn btn-xs-lg btn-secondary ms-auto dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
                <span class="flag-icon flag-icon-gb"></span>
              </button>
              <ul class="dropdown-menu ms-auto login">
                                <li>
                    <a class="dropdown-item " href="?lang=cs-cz">
                      <span class="flag-icon flag-icon-cz"></span>Čeština (Czech)
                    </a>
                  </li>
                                <li>
                    <a class="dropdown-item " href="?lang=da-dk">
                      <span class="flag-icon flag-icon-dk"></span>Danish (Dansk)
                    </a>
                  </li>
                                <li>
                    <a class="dropdown-item " href="?lang=de-de">
                      <span class="flag-icon flag-icon-de"></span>Deutsch (German)
                    </a>
                  </li>
                                <li>
                    <a class="dropdown-item active" href="?lang=en-gb">
                      <span class="flag-icon flag-icon-gb"></span>English
                    </a>
                  </li>
                                <li>
                    <a class="dropdown-item " href="?lang=es-es">
                      <span class="flag-icon flag-icon-es"></span>Español (Spanish)
                    </a>
                  </li>
                                <li>
                    <a class="dropdown-item " href="?lang=fi-fi">
                      <span class="flag-icon flag-icon-fi"></span>Suomi (Finish)
                    </a>
                  </li>
                                <li>
                    <a class="dropdown-item " href="?lang=fr-fr">
                      <span class="flag-icon flag-icon-fr"></span>Français (French)
                    </a>
                  </li>
                                <li>
                    <a class="dropdown-item " href="?lang=hu-hu">
                      <span class="flag-icon flag-icon-hu"></span>Magyar (Hungarian)
                    </a>
                  </li>
                                <li>
                    <a class="dropdown-item " href="?lang=it-it">
                      <span class="flag-icon flag-icon-it"></span>Italiano (Italian)
                    </a>
                  </li>
                                <li>
                    <a class="dropdown-item " href="?lang=ko-kr">
                      <span class="flag-icon flag-icon-kr"></span>한국어 (Korean)
                    </a>
                  </li>
                                <li>
                    <a class="dropdown-item " href="?lang=lv-lv">
                      <span class="flag-icon flag-icon-lv"></span>latviešu (Latvian)
                    </a>
                  </li>
                                <li>
                    <a class="dropdown-item " href="?lang=nl-nl">
                      <span class="flag-icon flag-icon-nl"></span>Nederlands (Dutch)
                    </a>
                  </li>
                                <li>
                    <a class="dropdown-item " href="?lang=pl-pl">
                      <span class="flag-icon flag-icon-pl"></span>Język Polski (Polish)
                    </a>
                  </li>
                                <li>
                    <a class="dropdown-item " href="?lang=pt-pt">
                      <span class="flag-icon flag-icon-pt"></span>Português (Portuguese)
                    </a>
                  </li>
                                <li>
                    <a class="dropdown-item " href="?lang=ro-ro">
                      <span class="flag-icon flag-icon-ro"></span>Română (Romanian)
                    </a>
                  </li>
                                <li>
                    <a class="dropdown-item " href="?lang=ru-ru">
                      <span class="flag-icon flag-icon-ru"></span>Pусский (Russian)
                    </a>
                  </li>
                                <li>
                    <a class="dropdown-item " href="?lang=sk-sk">
                      <span class="flag-icon flag-icon-sk"></span>Slovenčina (Slovak)
                    </a>
                  </li>
                                <li>
                    <a class="dropdown-item " href="?lang=sv-se">
                      <span class="flag-icon flag-icon-se"></span>Svenska (Swedish)
                    </a>
                  </li>
                                <li>
                    <a class="dropdown-item " href="?lang=tr-tr">
                      <span class="flag-icon flag-icon-tr"></span>Türkçe (Turkish)
                    </a>
                  </li>
                                <li>
                    <a class="dropdown-item " href="?lang=uk-ua">
                      <span class="flag-icon flag-icon-ua"></span>Українська (Ukrainian)
                    </a>
                  </li>
                                <li>
                    <a class="dropdown-item " href="?lang=zh-cn">
                      <span class="flag-icon flag-icon-cn"></span>简体中文 (Simplified Chinese)
                    </a>
                  </li>
                                <li>
                    <a class="dropdown-item " href="?lang=zh-tw">
                      <span class="flag-icon flag-icon-tw"></span>繁體中文 (Traditional Chinese)
                    </a>
                  </li>
                            </ul>
                        </div>
          </form>
                  <div class="my-4" id="fido2-alerts"></div>
                  <legend><i class="bi bi-link-45deg"></i> Apps</legend><hr />
          <div class="my-2 d-flex flex-wrap apps">
                                    <div class="m-2">
                <a href="/SOGo/" role="button"  class="btn btn-primary btn-block">Webmail</a>
              </div>
                                        </div>
                </div>
      </div>
    </div>
  </div>
  <div class="row">
    <div class="col-12 col-md-7 col-lg-6 col-xl-5 ms-auto me-auto">
      <div class="card">
        <div class="card-header">
          <a class="btn btn-link" data-bs-toggle="collapse" href="#collapse1"><i class="bi bi-patch-question-fill"></i> Show/Hide help panel</a>
        </div>
        <div id="collapse1" class="card-collapse collapse">
          <div class="card-body">
                      <p><span style="border-bottom: 1px dotted #999;">mailcow UI</span></p>
            <p><b>Domain administrators</b> create, modify or delete mailboxes and aliases, change domains and read further information about their assigned domains.<br>
  <b>Mailbox users</b> are able to create time-limited aliases (spam aliases), change their password and spam filter settings.</p>
            <p><span style="border-bottom: 1px dotted #999;">Apps</span></p>
            <p>Use a mailcow app to access your mails, calendar, contacts and more.</p>
                    </div>
        </div>
      </div>
    </div>
    </div>
  </div>
  
  <div id="ConfirmDeleteModal" class="modal fade" role="dialog">
    <div class="modal-dialog">
      <div class="modal-content">
        <div class="modal-header">
          <h3 class="modal-title">Confirm deletion</h3>
          <button type="button" class="btn-close" data-bs-dismiss="modal"></button>
        </div>
        <div class="modal-body">
          <p id="DeleteText">Please confirm your changes to the following object id</p>
          <ul id="ItemsToDelete"></ul>
          <hr>
          <button class="btn btn-sm btn-xs-half d-block d-sm-inline btn-danger" id="IsConfirmed">Delete now</button>
          <button class="btn btn-sm btn-xs-half d-block d-sm-inline btn-secondary" id="isCanceled">Cancel</button>
        </div>
      </div>
    </div>
  </div>
  <!-- version modal -->
  <div class="modal fade" id="showVersionModal" tabindex="-1" role="dialog" aria-hidden="true">
    <div class="modal-dialog modal-lg">
      <div class="modal-content">
        <div class="modal-header">
          <h5 class="modal-title"></h5>
          <button type="button" class="btn-close" data-bs-dismiss="modal"></button>
        </div>
        <div class="modal-body d-flex flex-column mt-2 p-4">
          <div class="spinner-border mx-auto" role="status">
            <span class="visually-hidden">Loading...</span>
          </div>
        </div>
      </div>
    </div>
  </div><!-- version modal -->
  
  <script src="/cache/4983cf8217fb81e78055b36a33e275e74c0cdb39.js"></script>
  <script>
    var lang_footer = {"cancel":"Cancel","confirm_delete":"Confirm deletion","delete_now":"Delete now","delete_these_items":"Please confirm your changes to the following object id","hibp_check":"Check against haveibeenpwned.com","hibp_nok":"Matched! This is a potentially dangerous password!","hibp_ok":"No match found.","loading":"Please wait...","nothing_selected":"Nothing selected","restart_container":"Restart container","restart_container_info":"<b>Important:<\/b> A graceful restart may take a while to complete, please wait for it to finish.","restart_now":"Restart now","restarting_container":"Restarting container, this may take a while"};
    var lang_acl = {"alias_domains":"Add alias domains","app_passwds":"Manage app passwords","bcc_maps":"BCC maps","delimiter_action":"Delimiter action","domain_desc":"Change domain description","domain_relayhost":"Change relayhost for a domain","eas_reset":"Reset EAS devices","extend_sender_acl":"Allow to extend sender ACL by external addresses","filters":"Filters","login_as":"Login as mailbox user","mailbox_relayhost":"Change relayhost for a mailbox","prohibited":"Prohibited by ACL","protocol_access":"Change protocol access","pushover":"Pushover","quarantine":"Quarantine actions","quarantine_attachments":"Quarantine attachments","quarantine_category":"Change quarantine notification category","quarantine_notification":"Change quarantine notifications","ratelimit":"Rate limit","recipient_maps":"Recipient maps","smtp_ip_access":"Change allowed hosts for SMTP","sogo_access":"Allow management of SOGo access","sogo_profile_reset":"Reset SOGo profile","spam_alias":"Temporary aliases","spam_policy":"Blacklist\/Whitelist","spam_score":"Spam score","syncjobs":"Sync jobs","tls_policy":"TLS policy","unlimited_quota":"Unlimited quota for mailboxes"};
    var lang_tfa = {"api_register":"%s uses the Yubico Cloud API. Please get an API key for your key <a href=\"https:\/\/upgrade.yubico.com\/getapikey\/\" target=\"_blank\">here<\/a>","confirm":"Confirm","confirm_totp_token":"Please confirm your changes by entering the generated token","delete_tfa":"Disable TFA","disable_tfa":"Disable TFA until next successful login","enter_qr_code":"Your TOTP code if your device cannot scan QR codes","error_code":"Error code","init_webauthn":"Initializing, please wait...","key_id":"An identifier for your Device","key_id_totp":"An identifier for your key","none":"Deactivate","reload_retry":"- (reload browser if the error persists)","scan_qr_code":"Please scan the following code with your authenticator app or enter the code manually.","select":"Please select","set_tfa":"Set two-factor authentication method","start_webauthn_validation":"Start validation","tfa":"Two-factor authentication","tfa_token_invalid":"TFA token invalid","totp":"Time-based OTP (Google Authenticator, Authy, etc.)","u2f_deprecated":"It seems that your Key was registered using the deprecated U2F method. We will deactivate Two-Factor-Authenticaiton for you and delete your Key.","u2f_deprecated_important":"Please register your Key in the admin panel with the new WebAuthn method.","webauthn":"WebAuthn authentication","waiting_usb_auth":"<i>Waiting for USB device...<\/i><br><br>Please tap the button on your USB device now.","waiting_usb_register":"<i>Waiting for USB device...<\/i><br><br>Please enter your password above and confirm your registration by tapping the button on your USB device.","yubi_otp":"Yubico OTP authentication"};
    var lang_fido2 = {"confirm":"Confirm","fido2_auth":"Login with FIDO2","fido2_success":"Device successfully registered","fido2_validation_failed":"Validation failed","fn":"Friendly name","known_ids":"Known IDs","none":"Disabled","register_status":"Registration status","rename":"Rename","set_fido2":"Register FIDO2 device","set_fido2_touchid":"Register Touch ID on Apple M1","set_fn":"Set friendly name","start_fido2_validation":"Start FIDO2 validation"};
    var docker_timeout = 60 * 1000;
    var mailcow_cc_role = '';
    var last_login = '';
    var mailcow_info = {
      version_tag: '2023-04b',
      last_version_tag: '',
      updatedAt: '1684918689',
      project_url: 'https://github.com/mailcow/mailcow-dockerized',
      project_owner: 'mailcow',
      project_repo: 'mailcow-dockerized',
      branch: 'master'
    };
  
  $(window).scroll(function() {
    sessionStorage.scrollTop = $(this).scrollTop();
  });
  // Select language and reopen active URL without POST
  function setLang(sel) {
    $.post( '/', {lang: sel} );
    window.location.href = window.location.pathname + window.location.search;
  }
  // FIDO2 functions
  function arrayBufferToBase64(buffer) {
    let binary = '';
    let bytes = new Uint8Array(buffer);
    let len = bytes.byteLength;
    for (let i = 0; i < len; i++) {
      binary += String.fromCharCode( bytes[ i ] );
    }
    return window.btoa(binary);
  }
  function recursiveBase64StrToArrayBuffer(obj) {
    let prefix = '=?BINARY?B?';
    let suffix = '?=';
    if (typeof obj === 'object') {
      for (let key in obj) {
        if (typeof obj[key] === 'string') {
          let str = obj[key];
          if (str.substring(0, prefix.length) === prefix && str.substring(str.length - suffix.length) === suffix) {
            str = str.substring(prefix.length, str.length - suffix.length);
            let binary_string = window.atob(str);
            let len = binary_string.length;
            let bytes = new Uint8Array(len);
            for (let i = 0; i < len; i++) {
              bytes[i] = binary_string.charCodeAt(i);
            }
            obj[key] = bytes.buffer;
          }
        } else {
          recursiveBase64StrToArrayBuffer(obj[key]);
        }
      }
    }
  }
    $(window).on('load', function() {
      $(".overlay").hide();
    });
    $(document).ready(function() {
      $(document).on('shown.bs.modal', function(e) {
        modal_id = $(e.relatedTarget).data('target');
        $(modal_id).attr("aria-hidden","false");
      });
      // TFA, CSRF, Alerts in footer.inc.php
      // Other general functions in mailcow.js
      
      // Confirm TFA modal
    
  
      // Validate FIDO2
    $("#fido2-login").click(function(){
      $('#fido2-alerts').html();
      if (!window.fetch || !navigator.credentials || !navigator.credentials.create) {
        window.alert('Browser not supported.');
        return;
      }
      window.fetch("/api/v1/get/fido2-get-args", {method:'GET',cache:'no-cache'}).then(function(response) {
        return response.json();
      }).then(function(json) {
      if (json.success === false) {
        throw new Error();
      }
      recursiveBase64StrToArrayBuffer(json);
      return json;
      }).then(function(getCredentialArgs) {
        return navigator.credentials.get(getCredentialArgs);
      }).then(function(cred) {
        return {
          id: cred.rawId ? arrayBufferToBase64(cred.rawId) : null,
          clientDataJSON: cred.response.clientDataJSON  ? arrayBufferToBase64(cred.response.clientDataJSON) : null,
          authenticatorData: cred.response.authenticatorData ? arrayBufferToBase64(cred.response.authenticatorData) : null,
          signature : cred.response.signature ? arrayBufferToBase64(cred.response.signature) : null
        };
      }).then(JSON.stringify).then(function(AuthenticatorAttestationResponse) {
        return window.fetch("/api/v1/process/fido2-args", {method:'POST', body: AuthenticatorAttestationResponse, cache:'no-cache'});
      }).then(function(response) {
        return response.json();
      }).then(function(json) {
        if (json.success) {
          window.location = window.location.href.split("#")[0];
    } else {
      throw new Error();
    }
    }).catch(function(err) {
      if (typeof err.message === 'undefined') {
        mailcow_alert_box(lang_fido2.fido2_validation_failed, "danger");
      } else {
        mailcow_alert_box(lang_fido2.fido2_validation_failed + ":<br><i>" + err.message + "</i>", "danger");
      }
    });
    });
    // Set TFA/FIDO2
    $("#register-fido2, #register-fido2-touchid").click(function(){
      let t = $(this);
  
      $("option:selected").prop("selected", false);
      if (!window.fetch || !navigator.credentials || !navigator.credentials.create) {
        window.alert('Browser not supported.');
        return;
      }
  
      window.fetch("/api/v1/get/fido2-registration/null", {method:'GET',cache:'no-cache'}).then(function(response) {
        return response.json();
      }).then(function(json) {
        if (json.success === false) {
          throw new Error(json.msg);
        }
        recursiveBase64StrToArrayBuffer(json);
  
        // set attestation to node if we are registering apple touch id
        if(t.attr('id') === 'register-fido2-touchid') {
          json.publicKey.attestation = 'none';
          json.publicKey.authenticatorSelection.authenticatorAttachment = "platform";
        }
  
        return json;
      }).then(function(createCredentialArgs) {
        console.log(createCredentialArgs);
        return navigator.credentials.create(createCredentialArgs);
      }).then(function(cred) {
        return {
          clientDataJSON: cred.response.clientDataJSON  ? arrayBufferToBase64(cred.response.clientDataJSON) : null,
          attestationObject: cred.response.attestationObject ? arrayBufferToBase64(cred.response.attestationObject) : null
        };
      }).then(JSON.stringify).then(function(AuthenticatorAttestationResponse) {
        return window.fetch("/api/v1/add/fido2-registration", {method:'POST', body: AuthenticatorAttestationResponse, cache:'no-cache'});
      }).then(function(response) {
        return response.json();
      }).then(function(json) {
        if (json.success) {
          window.location = window.location.href.split("#")[0];
        } else {
          throw new Error(json.msg);
        }
      }).catch(function(err) {
        $('#fido2-alerts').html('<span class="text-danger"><b>' + err.message + '</b></span>');
      });
    });
    $('#selectTFA').change(function () {
      if ($(this).val() == "yubi_otp") {
        $('#YubiOTPModal').modal('show');
        $("option:selected").prop("selected", false);
      }
      if ($(this).val() == "totp") {
        $('#TOTPModal').modal('show');
        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);
        });
        $("option:selected").prop("selected", false);
      }
      if ($(this).val() == "webauthn") {
          // check if Browser is supported
          if (!window.fetch || !navigator.credentials || !navigator.credentials.create) {
              window.alert('Browser not supported.');
              return;
          }
  
          // show modal
          $('#WebAuthnModal').modal('show');
          $("option:selected").prop("selected", false);
  
          $("#start_webauthn_register").click(() => {
              var key_id = document.getElementsByName('key_id')[1].value;
              var confirm_password = document.getElementsByName('confirm_password')[1].value;
  
              // fetch WebAuthn create args
              window.fetch("/api/v1/get/webauthn-tfa-registration/null", {method:'GET',cache:'no-cache'}).then(response => {
                  return response.json();
              }).then(json => {
                  console.log(json);
                  if (json.success === false) throw new Error(json.msg);
                  recursiveBase64StrToArrayBuffer(json);
  
                  return json;
              }).then(createCredentialArgs => {
                  // create credentials
                  return navigator.credentials.create(createCredentialArgs);
              }).then(cred => {
                  return {
                      clientDataJSON: cred.response.clientDataJSON  ? arrayBufferToBase64(cred.response.clientDataJSON) : null,
                      attestationObject: cred.response.attestationObject ? arrayBufferToBase64(cred.response.attestationObject) : null,
                      key_id: key_id,
                      tfa_method: "webauthn",
                      confirm_password: confirm_password
                  };
              }).then(JSON.stringify).then(AuthenticatorAttestationResponse => {
                  // send request
                  return window.fetch("/api/v1/add/webauthn-tfa-registration", {method:'POST', body: AuthenticatorAttestationResponse, cache:'no-cache'});
              }).then(response => {
                  return response.json();
              }).then(json => {
                  if (json.success) {
                      // reload on success
                      window.location = window.location.href.split("#")[0];
                  } else {
                      throw new Error(json.msg);
                  }
              }).catch(function(err) {
                  console.log(err);
                  var webauthn_return_code = document.getElementById('webauthn_return_code');
                  webauthn_return_code.style.display = webauthn_return_code.style.display === 'none' ? '' : null;
                  webauthn_return_code.innerHTML = lang_tfa.error_code + ': ' + err + ' ' + lang_tfa.reload_retry;
              });
          });
      }
      if ($(this).val() == "none") {
        $('#DisableTFAModal').modal('show');
        $("option:selected").prop("selected", false);
      }
    });
  
    
    // CSRF
    $('<input type="hidden" value="fc0cc16b258379afbbbf8408be5658e589f1534c08d3467d6da289d6b3ce59eb">').attr('name', 'csrf_token').appendTo('form');
    if (sessionStorage.scrollTop != "undefined") {
      $(window).scrollTop(sessionStorage.scrollTop);
    }
    });
  </script>
  
  <div class="container footer">
        
    </div>
  </body>
  </html>
  
services.name: http://93.185.65.102/favicon.png
services.body_hash_sha1: sha1:c36fa853d0bc7e938e026c2fb4f2f659ebf1a0c7
services.supported_versions: HTTP/1.1
services.protocol: HTTP
services.transport_protocol: TCP
services.scan_time: 2025-07-28T02:49:51.305430
services.banner: HTTP/1.1 200 OK
  Server: nginx
  Date:  <REDACTED>
  Content-Type: text/html; charset=utf-8
  Transfer-Encoding: chunked
  Connection: keep-alive
  Vary: Accept-Encoding
  Set-Cookie: PHPSESSID=1f9cc169564607536b9c1a08d6160a42; path=/; secure; HttpOnly
  Expires: Thu, 19 Nov 1981 08:52:00 GMT
  Cache-Control: no-store, no-cache, must-revalidate
  Pragma: no-cache
  Strict-Transport-Security: max-age=15768000;
  X-Content-Type-Options: nosniff
  X-XSS-Protection: 1; mode=block
  X-Robots-Tag: none
  X-Download-Options: noopen
  X-Frame-Options: SAMEORIGIN
  X-Permitted-Cross-Domain-Policies: none
  Referrer-Policy: strict-origin
  Content-Encoding: gzip
  
services.version_selected: TLSv1_3
services.cipher_selected: TLS_AES_256_GCM_SHA384
services.ja4s: t130200_1302_a56c5b993250
services.version: TLSv1_3
services.ja4s: t130200_1302_a56c5b993250
services.version: TLSv1_2
services.ja4s: t120200_c030_344b4dce5a52
services.names: srv3.bec.kz
services.issuer_dn: C=DE, ST=NRW, L=Willich, O=mailcow, OU=mailcow, CN=srv3.bec.kz
services.common_name: srv3.bec.kz
services.country: DE
services.locality: Willich
services.province: NRW
services.organization: mailcow
services.organizational_unit: mailcow
services.subject_dn: C=DE, ST=NRW, L=Willich, O=mailcow, OU=mailcow, CN=srv3.bec.kz
services.common_name: srv3.bec.kz
services.country: DE
services.locality: Willich
services.province: NRW
services.organization: mailcow
services.organizational_unit: mailcow
services.scan_time: 2025-07-27T23:35:27.905619
services.source: OSI_APPLICATION_LAYER
services.part: a
services.vendor: PHP
services.product: PHP
services.cpe: cpe:2.3:a:php:php:*:*:*:*:*:*:*:*
services.source: OSI_APPLICATION_LAYER
services.part: a
services.vendor: nginx
services.product: nginx
services.cpe: cpe:2.3:a:f5:nginx:*:*:*:*:*:*:*:*
services.value: login-page
services.path: /
services.endpoint_type: HTTP
services.scan_time: 2025-07-28T02:49:51.305430
services.uri: https://93.185.65.102/
services.protocol: HTTP/1.1
services.status_reason: OK
services.key: Vary
services.headers: Accept-Encoding
services.key: Transfer-Encoding
services.headers: chunked
services.key: X-Download-Options
services.headers: noopen
services.key: Server
services.headers: nginx
services.key: Strict-Transport-Security
services.headers: max-age=15768000;
services.key: Referrer-Policy
services.headers: strict-origin
services.key: Cache-Control
services.headers: no-store, no-cache, must-revalidate
services.key: X-Content-Type-Options
services.headers: nosniff
services.key: Content-Type
services.headers: text/html; charset=utf-8
services.key: Pragma
services.headers: no-cache
services.key: Date
services.headers: <REDACTED>
services.key: X-Robots-Tag
services.headers: none
services.key: Set-Cookie
services.headers: PHPSESSID=1f9cc169564607536b9c1a08d6160a42; path=/; secure; HttpOnly
services.key: X-Frame-Options
services.headers: SAMEORIGIN
services.key: X-Permitted-Cross-Domain-Policies
services.headers: none
services.key: X-XSS-Protection
services.headers: 1; mode=block
services.key: Expires
services.headers: Thu, 19 Nov 1981 08:52:00 GMT
services.key: Content-Encoding
services.headers: gzip
services.key: Connection
services.headers: keep-alive
services.html_tags: <title>mailcow UI</title> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0"> <meta name="theme-color" content="#F5D76E"/> <meta http-equiv="Referrer-Policy" content="same-origin">
services.body: <!DOCTYPE html>
  <html lang="en-gb">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0">
    <meta name="theme-color" content="#F5D76E"/>
    <meta http-equiv="Referrer-Policy" content="same-origin">
    <title>mailcow UI</title>
  
    <link rel="stylesheet" href="/cache/23c5be9eaf94cb1d3e5c1a698f305e5549eb0c08.css">
    <script>
      // check if darkmode is preferred by OS or set by localStorage
      if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches && localStorage.getItem("theme") !== "light" ||
          localStorage.getItem("theme") === "dark") {
        var head  = document.getElementsByTagName('head')[0];
        var link  = document.createElement('link');
        link.id   = 'dark-mode-theme';
        link.rel  = 'stylesheet';
        link.type = 'text/css';
        link.href = '/css/themes/mailcow-darkmode.css';
        head.appendChild(link);
      }
    </script>
  
    <link rel="shortcut icon" href="/favicon.png" type="image/png">
    <link rel="icon" href="/favicon.png" type="image/png">
  </head>
  <body>
  <div class="overlay"></div>
  
  <form action="/" method="post" id="logout"><input type="hidden" name="logout"></form>
  
  
  <div class="container my-4">
  <div class="row mb-4" style="margin-top: 60px">
    <div class="col-12 col-md-7 col-lg-6 col-xl-5 ms-auto me-auto">
      <div class="card">
        <div class="card-header d-flex align-items-center">
          <i class="bi bi-person-fill me-2"></i> Login
          <div class="ms-auto form-check form-switch my-auto d-flex align-items-center">
            <label class="form-check-label"><i class="bi bi-moon-fill"></i></label>
            <input class="form-check-input ms-2" type="checkbox" id="dark-mode-toggle">
          </div>
        </div>
        <div class="card-body">
          <div class="text-center mailcow-logo mb-4"><img src="/img/cow_mailcow.svg" alt="mailcow"></div>
                  <legend>mailcow UI</legend><hr />
                  <form method="post" autofill="off">
            <div class="d-flex mt-3">
              <label class="visually-hidden" for="login_user">Username</label>
              <div class="input-group">
                <div class="input-group-text"><i class="bi bi-person-fill"></i></div>
                <input name="login_user" autocorrect="off" autocapitalize="none" type="text" id="login_user" class="form-control" placeholder="Username" required="" autofocus="" autocomplete="username">
              </div>
            </div>
            <div class="d-flex mt-3">
              <label class="visually-hidden" for="pass_user">Password</label>
              <div class="input-group">
                <div class="input-group-text"><i class="bi bi-lock-fill"></i></div>
                <input name="pass_user" type="password" id="pass_user" class="form-control" placeholder="Password" required="" autocomplete="current-password">
              </div>
            </div>
            <div class="d-flex mt-4" style="position: relative">
              <button type="submit" class="btn btn-xs-lg btn-success" value="Login">Login</button>
              <button type="button" class="btn btn-xs-lg btn-success ms-2" id="fido2-login"><i class="bi bi-shield-fill-check"></i> FIDO2/WebAuthn Login</button>
                          <button type="button"  class="btn btn-xs-lg btn-secondary ms-auto dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
                <span class="flag-icon flag-icon-gb"></span>
              </button>
              <ul class="dropdown-menu ms-auto login">
                                <li>
                    <a class="dropdown-item " href="?lang=cs-cz">
                      <span class="flag-icon flag-icon-cz"></span>Čeština (Czech)
                    </a>
                  </li>
                                <li>
                    <a class="dropdown-item " href="?lang=da-dk">
                      <span class="flag-icon flag-icon-dk"></span>Danish (Dansk)
                    </a>
                  </li>
                                <li>
                    <a class="dropdown-item " href="?lang=de-de">
                      <span class="flag-icon flag-icon-de"></span>Deutsch (German)
                    </a>
                  </li>
                                <li>
                    <a class="dropdown-item active" href="?lang=en-gb">
                      <span class="flag-icon flag-icon-gb"></span>English
                    </a>
                  </li>
                                <li>
                    <a class="dropdown-item " href="?lang=es-es">
                      <span class="flag-icon flag-icon-es"></span>Español (Spanish)
                    </a>
                  </li>
                                <li>
                    <a class="dropdown-item " href="?lang=fi-fi">
                      <span class="flag-icon flag-icon-fi"></span>Suomi (Finish)
                    </a>
                  </li>
                                <li>
                    <a class="dropdown-item " href="?lang=fr-fr">
                      <span class="flag-icon flag-icon-fr"></span>Français (French)
                    </a>
                  </li>
                                <li>
                    <a class="dropdown-item " href="?lang=hu-hu">
                      <span class="flag-icon flag-icon-hu"></span>Magyar (Hungarian)
                    </a>
                  </li>
                                <li>
                    <a class="dropdown-item " href="?lang=it-it">
                      <span class="flag-icon flag-icon-it"></span>Italiano (Italian)
                    </a>
                  </li>
                                <li>
                    <a class="dropdown-item " href="?lang=ko-kr">
                      <span class="flag-icon flag-icon-kr"></span>한국어 (Korean)
                    </a>
                  </li>
                                <li>
                    <a class="dropdown-item " href="?lang=lv-lv">
                      <span class="flag-icon flag-icon-lv"></span>latviešu (Latvian)
                    </a>
                  </li>
                                <li>
                    <a class="dropdown-item " href="?lang=nl-nl">
                      <span class="flag-icon flag-icon-nl"></span>Nederlands (Dutch)
                    </a>
                  </li>
                                <li>
                    <a class="dropdown-item " href="?lang=pl-pl">
                      <span class="flag-icon flag-icon-pl"></span>Język Polski (Polish)
                    </a>
                  </li>
                                <li>
                    <a class="dropdown-item " href="?lang=pt-pt">
                      <span class="flag-icon flag-icon-pt"></span>Português (Portuguese)
                    </a>
                  </li>
                                <li>
                    <a class="dropdown-item " href="?lang=ro-ro">
                      <span class="flag-icon flag-icon-ro"></span>Română (Romanian)
                    </a>
                  </li>
                                <li>
                    <a class="dropdown-item " href="?lang=ru-ru">
                      <span class="flag-icon flag-icon-ru"></span>Pусский (Russian)
                    </a>
                  </li>
                                <li>
                    <a class="dropdown-item " href="?lang=sk-sk">
                      <span class="flag-icon flag-icon-sk"></span>Slovenčina (Slovak)
                    </a>
                  </li>
                                <li>
                    <a class="dropdown-item " href="?lang=sv-se">
                      <span class="flag-icon flag-icon-se"></span>Svenska (Swedish)
                    </a>
                  </li>
                                <li>
                    <a class="dropdown-item " href="?lang=tr-tr">
                      <span class="flag-icon flag-icon-tr"></span>Türkçe (Turkish)
                    </a>
                  </li>
                                <li>
                    <a class="dropdown-item " href="?lang=uk-ua">
                      <span class="flag-icon flag-icon-ua"></span>Українська (Ukrainian)
                    </a>
                  </li>
                                <li>
                    <a class="dropdown-item " href="?lang=zh-cn">
                      <span class="flag-icon flag-icon-cn"></span>简体中文 (Simplified Chinese)
                    </a>
                  </li>
                                <li>
                    <a class="dropdown-item " href="?lang=zh-tw">
                      <span class="flag-icon flag-icon-tw"></span>繁體中文 (Traditional Chinese)
                    </a>
                  </li>
                            </ul>
                        </div>
          </form>
                  <div class="my-4" id="fido2-alerts"></div>
                  <legend><i class="bi bi-link-45deg"></i> Apps</legend><hr />
          <div class="my-2 d-flex flex-wrap apps">
                                    <div class="m-2">
                <a href="/SOGo/" role="button"  class="btn btn-primary btn-block">Webmail</a>
              </div>
                                        </div>
                </div>
      </div>
    </div>
  </div>
  <div class="row">
    <div class="col-12 col-md-7 col-lg-6 col-xl-5 ms-auto me-auto">
      <div class="card">
        <div class="card-header">
          <a class="btn btn-link" data-bs-toggle="collapse" href="#collapse1"><i class="bi bi-patch-question-fill"></i> Show/Hide help panel</a>
        </div>
        <div id="collapse1" class="card-collapse collapse">
          <div class="card-body">
                      <p><span style="border-bottom: 1px dotted #999;">mailcow UI</span></p>
            <p><b>Domain administrators</b> create, modify or delete mailboxes and aliases, change domains and read further information about their assigned domains.<br>
  <b>Mailbox users</b> are able to create time-limited aliases (spam aliases), change their password and spam filter settings.</p>
            <p><span style="border-bottom: 1px dotted #999;">Apps</span></p>
            <p>Use a mailcow app to access your mails, calendar, contacts and more.</p>
                    </div>
        </div>
      </div>
    </div>
    </div>
  </div>
  
  <div id="ConfirmDeleteModal" class="modal fade" role="dialog">
    <div class="modal-dialog">
      <div class="modal-content">
        <div class="modal-header">
          <h3 class="modal-title">Confirm deletion</h3>
          <button type="button" class="btn-close" data-bs-dismiss="modal"></button>
        </div>
        <div class="modal-body">
          <p id="DeleteText">Please confirm your changes to the following object id</p>
          <ul id="ItemsToDelete"></ul>
          <hr>
          <button class="btn btn-sm btn-xs-half d-block d-sm-inline btn-danger" id="IsConfirmed">Delete now</button>
          <button class="btn btn-sm btn-xs-half d-block d-sm-inline btn-secondary" id="isCanceled">Cancel</button>
        </div>
      </div>
    </div>
  </div>
  <!-- version modal -->
  <div class="modal fade" id="showVersionModal" tabindex="-1" role="dialog" aria-hidden="true">
    <div class="modal-dialog modal-lg">
      <div class="modal-content">
        <div class="modal-header">
          <h5 class="modal-title"></h5>
          <button type="button" class="btn-close" data-bs-dismiss="modal"></button>
        </div>
        <div class="modal-body d-flex flex-column mt-2 p-4">
          <div class="spinner-border mx-auto" role="status">
            <span class="visually-hidden">Loading...</span>
          </div>
        </div>
      </div>
    </div>
  </div><!-- version modal -->
  
  <script src="/cache/4983cf8217fb81e78055b36a33e275e74c0cdb39.js"></script>
  <script>
    var lang_footer = {"cancel":"Cancel","confirm_delete":"Confirm deletion","delete_now":"Delete now","delete_these_items":"Please confirm your changes to the following object id","hibp_check":"Check against haveibeenpwned.com","hibp_nok":"Matched! This is a potentially dangerous password!","hibp_ok":"No match found.","loading":"Please wait...","nothing_selected":"Nothing selected","restart_container":"Restart container","restart_container_info":"<b>Important:<\/b> A graceful restart may take a while to complete, please wait for it to finish.","restart_now":"Restart now","restarting_container":"Restarting container, this may take a while"};
    var lang_acl = {"alias_domains":"Add alias domains","app_passwds":"Manage app passwords","bcc_maps":"BCC maps","delimiter_action":"Delimiter action","domain_desc":"Change domain description","domain_relayhost":"Change relayhost for a domain","eas_reset":"Reset EAS devices","extend_sender_acl":"Allow to extend sender ACL by external addresses","filters":"Filters","login_as":"Login as mailbox user","mailbox_relayhost":"Change relayhost for a mailbox","prohibited":"Prohibited by ACL","protocol_access":"Change protocol access","pushover":"Pushover","quarantine":"Quarantine actions","quarantine_attachments":"Quarantine attachments","quarantine_category":"Change quarantine notification category","quarantine_notification":"Change quarantine notifications","ratelimit":"Rate limit","recipient_maps":"Recipient maps","smtp_ip_access":"Change allowed hosts for SMTP","sogo_access":"Allow management of SOGo access","sogo_profile_reset":"Reset SOGo profile","spam_alias":"Temporary aliases","spam_policy":"Blacklist\/Whitelist","spam_score":"Spam score","syncjobs":"Sync jobs","tls_policy":"TLS policy","unlimited_quota":"Unlimited quota for mailboxes"};
    var lang_tfa = {"api_register":"%s uses the Yubico Cloud API. Please get an API key for your key <a href=\"https:\/\/upgrade.yubico.com\/getapikey\/\" target=\"_blank\">here<\/a>","confirm":"Confirm","confirm_totp_token":"Please confirm your changes by entering the generated token","delete_tfa":"Disable TFA","disable_tfa":"Disable TFA until next successful login","enter_qr_code":"Your TOTP code if your device cannot scan QR codes","error_code":"Error code","init_webauthn":"Initializing, please wait...","key_id":"An identifier for your Device","key_id_totp":"An identifier for your key","none":"Deactivate","reload_retry":"- (reload browser if the error persists)","scan_qr_code":"Please scan the following code with your authenticator app or enter the code manually.","select":"Please select","set_tfa":"Set two-factor authentication method","start_webauthn_validation":"Start validation","tfa":"Two-factor authentication","tfa_token_invalid":"TFA token invalid","totp":"Time-based OTP (Google Authenticator, Authy, etc.)","u2f_deprecated":"It seems that your Key was registered using the deprecated U2F method. We will deactivate Two-Factor-Authenticaiton for you and delete your Key.","u2f_deprecated_important":"Please register your Key in the admin panel with the new WebAuthn method.","webauthn":"WebAuthn authentication","waiting_usb_auth":"<i>Waiting for USB device...<\/i><br><br>Please tap the button on your USB device now.","waiting_usb_register":"<i>Waiting for USB device...<\/i><br><br>Please enter your password above and confirm your registration by tapping the button on your USB device.","yubi_otp":"Yubico OTP authentication"};
    var lang_fido2 = {"confirm":"Confirm","fido2_auth":"Login with FIDO2","fido2_success":"Device successfully registered","fido2_validation_failed":"Validation failed","fn":"Friendly name","known_ids":"Known IDs","none":"Disabled","register_status":"Registration status","rename":"Rename","set_fido2":"Register FIDO2 device","set_fido2_touchid":"Register Touch ID on Apple M1","set_fn":"Set friendly name","start_fido2_validation":"Start FIDO2 validation"};
    var docker_timeout = 60 * 1000;
    var mailcow_cc_role = '';
    var last_login = '';
    var mailcow_info = {
      version_tag: '2023-04b',
      last_version_tag: '',
      updatedAt: '1684918689',
      project_url: 'https://github.com/mailcow/mailcow-dockerized',
      project_owner: 'mailcow',
      project_repo: 'mailcow-dockerized',
      branch: 'master'
    };
  
  $(window).scroll(function() {
    sessionStorage.scrollTop = $(this).scrollTop();
  });
  // Select language and reopen active URL without POST
  function setLang(sel) {
    $.post( '/', {lang: sel} );
    window.location.href = window.location.pathname + window.location.search;
  }
  // FIDO2 functions
  function arrayBufferToBase64(buffer) {
    let binary = '';
    let bytes = new Uint8Array(buffer);
    let len = bytes.byteLength;
    for (let i = 0; i < len; i++) {
      binary += String.fromCharCode( bytes[ i ] );
    }
    return window.btoa(binary);
  }
  function recursiveBase64StrToArrayBuffer(obj) {
    let prefix = '=?BINARY?B?';
    let suffix = '?=';
    if (typeof obj === 'object') {
      for (let key in obj) {
        if (typeof obj[key] === 'string') {
          let str = obj[key];
          if (str.substring(0, prefix.length) === prefix && str.substring(str.length - suffix.length) === suffix) {
            str = str.substring(prefix.length, str.length - suffix.length);
            let binary_string = window.atob(str);
            let len = binary_string.length;
            let bytes = new Uint8Array(len);
            for (let i = 0; i < len; i++) {
              bytes[i] = binary_string.charCodeAt(i);
            }
            obj[key] = bytes.buffer;
          }
        } else {
          recursiveBase64StrToArrayBuffer(obj[key]);
        }
      }
    }
  }
    $(window).on('load', function() {
      $(".overlay").hide();
    });
    $(document).ready(function() {
      $(document).on('shown.bs.modal', function(e) {
        modal_id = $(e.relatedTarget).data('target');
        $(modal_id).attr("aria-hidden","false");
      });
      // TFA, CSRF, Alerts in footer.inc.php
      // Other general functions in mailcow.js
      
      // Confirm TFA modal
    
  
      // Validate FIDO2
    $("#fido2-login").click(function(){
      $('#fido2-alerts').html();
      if (!window.fetch || !navigator.credentials || !navigator.credentials.create) {
        window.alert('Browser not supported.');
        return;
      }
      window.fetch("/api/v1/get/fido2-get-args", {method:'GET',cache:'no-cache'}).then(function(response) {
        return response.json();
      }).then(function(json) {
      if (json.success === false) {
        throw new Error();
      }
      recursiveBase64StrToArrayBuffer(json);
      return json;
      }).then(function(getCredentialArgs) {
        return navigator.credentials.get(getCredentialArgs);
      }).then(function(cred) {
        return {
          id: cred.rawId ? arrayBufferToBase64(cred.rawId) : null,
          clientDataJSON: cred.response.clientDataJSON  ? arrayBufferToBase64(cred.response.clientDataJSON) : null,
          authenticatorData: cred.response.authenticatorData ? arrayBufferToBase64(cred.response.authenticatorData) : null,
          signature : cred.response.signature ? arrayBufferToBase64(cred.response.signature) : null
        };
      }).then(JSON.stringify).then(function(AuthenticatorAttestationResponse) {
        return window.fetch("/api/v1/process/fido2-args", {method:'POST', body: AuthenticatorAttestationResponse, cache:'no-cache'});
      }).then(function(response) {
        return response.json();
      }).then(function(json) {
        if (json.success) {
          window.location = window.location.href.split("#")[0];
    } else {
      throw new Error();
    }
    }).catch(function(err) {
      if (typeof err.message === 'undefined') {
        mailcow_alert_box(lang_fido2.fido2_validation_failed, "danger");
      } else {
        mailcow_alert_box(lang_fido2.fido2_validation_failed + ":<br><i>" + err.message + "</i>", "danger");
      }
    });
    });
    // Set TFA/FIDO2
    $("#register-fido2, #register-fido2-touchid").click(function(){
      let t = $(this);
  
      $("option:selected").prop("selected", false);
      if (!window.fetch || !navigator.credentials || !navigator.credentials.create) {
        window.alert('Browser not supported.');
        return;
      }
  
      window.fetch("/api/v1/get/fido2-registration/null", {method:'GET',cache:'no-cache'}).then(function(response) {
        return response.json();
      }).then(function(json) {
        if (json.success === false) {
          throw new Error(json.msg);
        }
        recursiveBase64StrToArrayBuffer(json);
  
        // set attestation to node if we are registering apple touch id
        if(t.attr('id') === 'register-fido2-touchid') {
          json.publicKey.attestation = 'none';
          json.publicKey.authenticatorSelection.authenticatorAttachment = "platform";
        }
  
        return json;
      }).then(function(createCredentialArgs) {
        console.log(createCredentialArgs);
        return navigator.credentials.create(createCredentialArgs);
      }).then(function(cred) {
        return {
          clientDataJSON: cred.response.clientDataJSON  ? arrayBufferToBase64(cred.response.clientDataJSON) : null,
          attestationObject: cred.response.attestationObject ? arrayBufferToBase64(cred.response.attestationObject) : null
        };
      }).then(JSON.stringify).then(function(AuthenticatorAttestationResponse) {
        return window.fetch("/api/v1/add/fido2-registration", {method:'POST', body: AuthenticatorAttestationResponse, cache:'no-cache'});
      }).then(function(response) {
        return response.json();
      }).then(function(json) {
        if (json.success) {
          window.location = window.location.href.split("#")[0];
        } else {
          throw new Error(json.msg);
        }
      }).catch(function(err) {
        $('#fido2-alerts').html('<span class="text-danger"><b>' + err.message + '</b></span>');
      });
    });
    $('#selectTFA').change(function () {
      if ($(this).val() == "yubi_otp") {
        $('#YubiOTPModal').modal('show');
        $("option:selected").prop("selected", false);
      }
      if ($(this).val() == "totp") {
        $('#TOTPModal').modal('show');
        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);
        });
        $("option:selected").prop("selected", false);
      }
      if ($(this).val() == "webauthn") {
          // check if Browser is supported
          if (!window.fetch || !navigator.credentials || !navigator.credentials.create) {
              window.alert('Browser not supported.');
              return;
          }
  
          // show modal
          $('#WebAuthnModal').modal('show');
          $("option:selected").prop("selected", false);
  
          $("#start_webauthn_register").click(() => {
              var key_id = document.getElementsByName('key_id')[1].value;
              var confirm_password = document.getElementsByName('confirm_password')[1].value;
  
              // fetch WebAuthn create args
              window.fetch("/api/v1/get/webauthn-tfa-registration/null", {method:'GET',cache:'no-cache'}).then(response => {
                  return response.json();
              }).then(json => {
                  console.log(json);
                  if (json.success === false) throw new Error(json.msg);
                  recursiveBase64StrToArrayBuffer(json);
  
                  return json;
              }).then(createCredentialArgs => {
                  // create credentials
                  return navigator.credentials.create(createCredentialArgs);
              }).then(cred => {
                  return {
                      clientDataJSON: cred.response.clientDataJSON  ? arrayBufferToBase64(cred.response.clientDataJSON) : null,
                      attestationObject: cred.response.attestationObject ? arrayBufferToBase64(cred.response.attestationObject) : null,
                      key_id: key_id,
                      tfa_method: "webauthn",
                      confirm_password: confirm_password
                  };
              }).then(JSON.stringify).then(AuthenticatorAttestationResponse => {
                  // send request
                  return window.fetch("/api/v1/add/webauthn-tfa-registration", {method:'POST', body: AuthenticatorAttestationResponse, cache:'no-cache'});
              }).then(response => {
                  return response.json();
              }).then(json => {
                  if (json.success) {
                      // reload on success
                      window.location = window.location.href.split("#")[0];
                  } else {
                      throw new Error(json.msg);
                  }
              }).catch(function(err) {
                  console.log(err);
                  var webauthn_return_code = document.getElementById('webauthn_return_code');
                  webauthn_return_code.style.display = webauthn_return_code.style.display === 'none' ? '' : null;
                  webauthn_return_code.innerHTML = lang_tfa.error_code + ': ' + err + ' ' + lang_tfa.reload_retry;
              });
          });
      }
      if ($(this).val() == "none") {
        $('#DisableTFAModal').modal('show');
        $("option:selected").prop("selected", false);
      }
    });
  
    
    // CSRF
    $('<input type="hidden" value="307be8be1cf28bc89d1b36b0dfb59b14f7691d5e285ce74ae5f7ea1c67ead59d">').attr('name', 'csrf_token').appendTo('form');
    if (sessionStorage.scrollTop != "undefined") {
      $(window).scrollTop(sessionStorage.scrollTop);
    }
    });
  </script>
  
  <div class="container footer">
        
    </div>
  </body>
  </html>
  
services.name: https://93.185.65.102/favicon.png
services.name: https://93.185.65.102/favicon.png
services.body_hash_sha1: sha1:a2143d58472cc5172f1d5633ae39f6bf33e3247c
services.supported_versions: HTTP/1.1 HTTP/2
services.protocol: SMTP
services.transport_protocol: TCP
services.scan_time: 2025-07-26T07:55:53.088486
services.banner: 220 mail.bec.kz ESMTP Postcow
  
services.version_selected: TLSv1_3
services.cipher_selected: TLS_AES_256_GCM_SHA384
services.ja4s: t130200_1302_a56c5b993250
services.version: TLSv1_3
services.ja4s: t130200_1302_a56c5b993250
services.version: TLSv1_2
services.ja4s: t120200_c030_344b4dce5a52
services.names: srv3.bec.kz
services.issuer_dn: C=DE, ST=NRW, L=Willich, O=mailcow, OU=mailcow, CN=srv3.bec.kz
services.common_name: srv3.bec.kz
services.country: DE
services.locality: Willich
services.province: NRW
services.organization: mailcow
services.organizational_unit: mailcow
services.subject_dn: C=DE, ST=NRW, L=Willich, O=mailcow, OU=mailcow, CN=srv3.bec.kz
services.common_name: srv3.bec.kz
services.country: DE
services.locality: Willich
services.province: NRW
services.organization: mailcow
services.organizational_unit: mailcow
services.scan_time: 2025-07-23T09:58:39.399727
services.value: email
services.banner: 220 mail.bec.kz ESMTP Postcow
  
services.protocol: IKE
services.transport_protocol: UDP
services.scan_time: 2025-07-28T05:38:41.671367
services.value: network.device.vpn
services.protocol: IMAP
services.transport_protocol: TCP
services.scan_time: 2025-07-27T23:33:57.525380
services.banner: * OK [CAPABILITY IMAP4rev1 SASL-IR LOGIN-REFERRALS ID ENABLE IDLE LITERAL+ AUTH=PLAIN AUTH=LOGIN] Dovecot ready.
  
services.version_selected: TLSv1_3
services.cipher_selected: TLS_AES_256_GCM_SHA384
services.ja4s: t130200_1302_a56c5b993250
services.version: TLSv1_3
services.ja4s: t130200_1302_a56c5b993250
services.version: TLSv1_2
services.ja4s: t120200_c030_344b4dce5a52
services.names: srv3.bec.kz
services.issuer_dn: C=DE, ST=NRW, L=Willich, O=mailcow, OU=mailcow, CN=srv3.bec.kz
services.common_name: srv3.bec.kz
services.country: DE
services.locality: Willich
services.province: NRW
services.organization: mailcow
services.organizational_unit: mailcow
services.subject_dn: C=DE, ST=NRW, L=Willich, O=mailcow, OU=mailcow, CN=srv3.bec.kz
services.common_name: srv3.bec.kz
services.country: DE
services.locality: Willich
services.province: NRW
services.organization: mailcow
services.organizational_unit: mailcow
services.source: OSI_APPLICATION_LAYER
services.part: a
services.vendor: Dovecot
services.product: Dovecot
services.cpe: cpe:2.3:a:dovecot:dovecot:*:*:*:*:*:*:*:*
services.source: OSI_TRANSPORT_LAYER
services.part: o
services.product: linux
services.cpe: cpe:2.3:o:*:linux:*:*:*:*:*:*:*:*
services.value: email
services.banner: * OK [CAPABILITY IMAP4rev1 SASL-IR LOGIN-REFERRALS ID ENABLE IDLE LITERAL+ AUTH=PLAIN AUTH=LOGIN] Dovecot ready.
  
services.protocol: L2TP
services.transport_protocol: UDP
services.scan_time: 2025-07-28T05:36:23.291560
services.hostname: srv5.comp.bec.kz
services.vendor_name: FreeBSD MPD
services.protocol: HTTP
services.transport_protocol: TCP
services.scan_time: 2025-07-27T15:03:02.464322
services.banner: HTTP/1.1 202 OK
  Connection: Keep-Alive
  Content-Length: 1999
  Content-Type: text/html
  Keep-Alive: timeout=15; max=19
  
services.version_selected: TLSv1_3
services.cipher_selected: TLS_AES_256_GCM_SHA384
services.ja4s: t130200_1302_a56c5b993250
services.version: TLSv1_3
services.ja4s: t130200_1302_a56c5b993250
services.version: TLSv1_2
services.ja4s: t120100_002f_bc98f8e001b5
services.version: TLSv1_1
services.ja4s: t110100_002f_bc98f8e001b5
services.version: TLSv1_0
services.ja4s: t100100_002f_bc98f8e001b5
services.names: vpn967038508.softether.net
services.issuer_dn: CN=vpn967038508.softether.net, O=Bb, OU=Cc, C=Dd, ST=Ee, L=Ff
services.common_name: vpn967038508.softether.net
services.country: Dd
services.locality: Ff
services.province: Ee
services.organization: Bb
services.organizational_unit: Cc
services.subject_dn: CN=vpn967038508.softether.net, O=Bb, OU=Cc, C=Dd, ST=Ee, L=Ff
services.common_name: vpn967038508.softether.net
services.country: Dd
services.locality: Ff
services.province: Ee
services.organization: Bb
services.organizational_unit: Cc
services.source: OSI_APPLICATION_LAYER
services.part: a
services.vendor: SoftEther
services.product: VPN Server
services.cpe: cpe:2.3:a:softether:vpn_server:*:*:*:*:*:*:*:*
services.value: network.device.vpn
services.path: /
services.endpoint_type: HTTP
services.scan_time: 2025-07-27T15:03:02.464322
services.uri: https://93.185.65.102:31344/
services.protocol: HTTP/1.1
services.status_reason: OK
services.key: Connection
services.headers: Keep-Alive
services.key: Content-Length
services.headers: 1999
services.key: Content-Type
services.headers: text/html
services.key: Keep-Alive
services.headers: timeout=15; max=19
services.html_tags: <title>SoftEther VPN Server</title> <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
services.body: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  <html xmlns="http://www.w3.org/1999/xhtml">
  
  <!-- 9C37197CA7C2428388C2E6E59B829B30 -->
  
  <head>
  <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
  <title>SoftEther VPN Server</title>
  </head>
  
  <body>
  
  <h1>SoftEther VPN Server / Bridge</h1>
  <p>For VPN users:</p>
  <ul>
  	<li>Connect to this VPN Server<ul>
  		<li>by <a href="https://www.softether-download.com/">Official SoftEther VPN 
  		Client (download)</a></li>
  		<li>by <a href="https://www.softether.org/">L2TP/IPsec, OpenVPN or SSTP 
  		traditional clients</a></li>
  	</ul>
  	</li>
  </ul>
  <p>For VPN administrators:</p>
  <ul>
  	<li>Manage this VPN Server or VPN Bridge<ul>
  		<li>by <a href="https://www.softether-download.com/">SoftEther VPN 
  		Server Manager GUI for Windows / macOS (download)</a> (Recommended)</li>
  		<li>by <a href="https://www.google.com/search?q=vpncmd">SoftEther VPN 
  		Command Line Management Utility (vpncmd)</a> for CUI</li>
  		<li>by <a href="/api/">JSON-RPC API</a> from your favorite programming 
  		language (JavaScript, TypeScript, Java, Python, Ruby, C#, ... etc.)<br />
  		(ID: &#39;administrator&#39;, Password: same to the VPN Server&#39;s password. 
  		Default: empty)</li>
  		<li>by <a href="/admin/">Built-in HTML5 Web Administration Console</a> 
  		(New, under construction)<br />
  		(ID: &#39;administrator&#39;, Password: same to the VPN Server&#39;s password. 
  		Default: empty)<br />
  		<br />
  		</li>
  	</ul>
  	</li>
  	<li>If you want to disable this embedded web server and JSON-RPC server:<ol>
  		<li>Stop the daemon.</li>
  		<li>Modify the value of <strong>&quot;bool DisableJsonRpcWebApi&quot;</strong> 
  		from <strong>&quot;false&quot;</strong> to <strong>&quot;true&quot;</strong> on the 
  		vpn_server.config or vpn_bridge.config.</li>
  		<li>Restart the daemon.</li>
  	</ol>
  	</li>
  </ul>
  
  <p>&nbsp;</p>
  
  </body>
  
  </html>
  
services.body_hash_sha1: sha1:6f35b7ed6f04d3405f99b2d9a0185a60d8b772b2
services.supported_versions: HTTP/1.1
[binary data, 52 values, 1,972 bytes]