Connector Open-Source Code

Browse connector files locally. Exchange API keys stay on your device.

ui/forgot_password.php

<?php
declare(strict_types=1);

require_once __DIR__ . '/common.php';

$resetScript = realpath(__DIR__ . '/../tools/reset_ui_password.php') ?: '/opt/nuxvision_connector/tools/reset_ui_password.php';
$resetCmd = 'sudo php ' . $resetScript;

render_header('Forgot Password', 'Forgot Password', false);
?>

<div class="d-flex flex-wrap gap-2 mb-3">
  <?php if (nv_ui_is_logged_in()): ?>
    <a class="btn btn-soft" href="./index.php"><i class="bi bi-house me-1"></i>Home</a>
    <a class="btn btn-soft" href="./account.php#security"><i class="bi bi-shield-lock me-1"></i>Change password</a>
  <?php else: ?>
    <a class="btn btn-soft" href="./login.php"><i class="bi bi-arrow-left me-1"></i>Back to login</a>
  <?php endif; ?>
</div>

<div class="row g-3">
  <div class="col-12 col-lg-8">
    <div class="nv-card">
      <div class="nv-titlebar">
        <strong>Forgot password</strong>
      </div>
      <div class="nv-pad">
        <p class="nv-muted mb-2">Run this command on the server to reset the UI password:</p>
        <div id="reset-cmd" class="mono p-2 rounded" style="background:rgba(9,16,33,.72);border:1px solid rgba(150,176,250,.2);word-break:break-all;">
          <?=h($resetCmd)?>
        </div>
        <div class="mt-2">
          <button id="copy-reset-cmd" class="btn btn-soft btn-sm" type="button">
            <i class="bi bi-clipboard me-1"></i>Copy command
          </button>
        </div>
        <div class="smallhint mt-2">You will be prompted to set a new password in terminal.</div>
      </div>
    </div>
  </div>
</div>

<script>
(function () {
  var btn = document.getElementById('copy-reset-cmd');
  var cmdEl = document.getElementById('reset-cmd');
  if (!btn || !cmdEl) return;

  btn.addEventListener('click', function () {
    var cmd = (cmdEl.textContent || '').trim();
    if (!cmd) return;

    function ok() {
      if (typeof window.nvShowToast === 'function') {
        window.nvShowToast('success', 'Command copied to clipboard.', 5000);
      }
    }
    function fail() {
      if (typeof window.nvShowToast === 'function') {
        window.nvShowToast('danger', 'Copy failed. Please copy manually.', 5000);
      }
    }

    if (navigator.clipboard && navigator.clipboard.writeText) {
      navigator.clipboard.writeText(cmd).then(ok).catch(fail);
      return;
    }

    try {
      var ta = document.createElement('textarea');
      ta.value = cmd;
      ta.setAttribute('readonly', '');
      ta.style.position = 'absolute';
      ta.style.left = '-9999px';
      document.body.appendChild(ta);
      ta.select();
      var copied = document.execCommand('copy');
      document.body.removeChild(ta);
      copied ? ok() : fail();
    } catch (e) {
      fail();
    }
  });
})();
</script>

<?php render_footer(); ?>