<!doctype html>
<html lang="ko" xmlns:th="http://www.thymeleaf.org">
<head th:replace="~{fragments/layout :: head('접근 검증')}"></head>
<body>
<nav th:replace="~{fragments/layout :: nav}"></nav>
<main class="container py-4">
  <div class="page-title">
    <h1>접근 검증</h1>
    <details class="explanation-details">
      <summary>도움말</summary>
      <p>한 사용자의 토큰으로 실제 데이터를 요청해, 설계한 권한이 DB에서 그대로 적용되는지 확인합니다. 결과는 DB 감사 로그에 남은 실행 SQL과 VPD 정보를 보여주며, SQL 재현은 설정을 읽기 위한 참고용으로 구분합니다.</p>
    </details>
  </div>

  <section class="content-band guided-check-intro">
    <div>
      <span class="architecture-kicker">이번 단계에서 확인하는 것</span>
      <h2>“이 사용자는 이 데이터에서 무엇을 볼 수 있는가?”</h2>
      <p>토큰과 대상 객체를 입력하면 실제 조회 결과를 보여줍니다.</p>
      <details class="explanation-details">
        <summary>권한 판정 과정 보기</summary>
        <p>토큰은 사용자를 찾는 열쇠입니다. 서버가 직접 역할과 그룹 상속 역할을 합치고, VPD는 저장된 행 규칙을 적용합니다. 컬럼 원문/마스킹은 ASO/Data Redaction 결과로 별도 확인합니다.</p>
      </details>
    </div>
    <a class="btn rw-btn-secondary" href="/tokens">검증 세션이 없나요? 먼저 발급하기</a>
  </section>

  <section class="content-band">
    <div class="section-heading">
      <div>
        <h2>검증할 사용자와 데이터 입력</h2>
        <p class="section-subtitle">등록 토큰 목록에서 고르는 대신 발급할 때 복사한 원문 하나만 사용합니다.</p>
      </div>
    </div>
    <form hx-post="/probe" hx-target="#probe-result" hx-swap="innerHTML" class="form-grid probe-form">
      <input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}">
      <label class="span-2">
        발급받은 토큰 원문
        <input class="form-control" name="bearerToken" type="password" autocomplete="off"
               placeholder="토큰 발급 직후 복사한 값을 붙여 넣으세요">
        <span class="form-hint">원문은 DB에 저장되지 않습니다. 아래 검증 세션 사용자를 선택하면 이 입력은 무시되고 실행 중 발급·완료 즉시 폐기됩니다. 둘 다 비우면 invalid token 결과를 확인할 수 있습니다.</span>
      </label>
      <label>
        검증 세션 사용자 (선택)
        <select class="form-select" name="tempUserId">
          <option value="">원문 토큰 사용</option>
          <option th:each="user : ${users}" th:value="${user.userId()}" th:text="${user.username()}"></option>
        </select>
        <span class="form-hint">ORDS 호출에 사용할 10분 검증 세션을 만들고 완료 후 바로 폐기합니다.</span>
      </label>
        <label>
          확인할 데이터
          <select class="form-select" name="objectId" required>
            <option th:each="object : ${objects}"
                    th:value="${object.objectId()}"
                    th:attr="data-vector-search=${object.objectName() == 'CB_VECTOR_SEARCH_DOCUMENTS'},data-description=${object.descriptionOrDefault()}"
                    th:text="${object.displayName() + (defaultObjectKeys.contains(object.displayName()) ? ' · 권한체계 자동 (권장)' : ' · 별도 Filter (고급 점검 필요)')}"></option>
          </select>
          <span class="form-hint" data-probe-object-description>선택한 대상의 설명이 여기에 표시됩니다.</span>
        </label>
      <label>
        최대 확인 행 수
          <input class="form-control" name="limit" type="number" min="1" max="500" value="50">
          <span class="form-hint">권한 판정에는 영향을 주지 않고 화면에 가져올 최대 행만 제한합니다.</span>
        </label>
        <label class="span-2 vector-probe-input" data-vector-probe-input hidden>
          벡터 검색어 (평문)
          <textarea class="form-control" name="requestBody" rows="3" required disabled
                    placeholder="예: Oracle VPD에서 ORDS 권한을 적용하는 방법"></textarea>
          <span class="form-hint">검색어를 평문으로 입력하면 시스템이 같은 임베딩 방식으로 벡터화해 전용 조회 경로에 전달합니다.</span>
        </label>
        <label class="vector-probe-input" data-vector-probe-input hidden>
          임베딩 방식
          <select class="form-select" name="embeddingMode" disabled>
            <option value="DEMO">로컬 임베딩(개발용)</option>
            <option value="AI" th:disabled="${!aiEmbeddingConfigured}">AI 임베딩</option>
          </select>
          <span class="form-hint">자료 등록 때 사용한 방식·차원과 맞춰야 합니다. AI 설정이 없으면 로컬 임베딩을 사용하세요.</span>
        </label>
        <button class="btn rw-btn-primary probe-submit" type="submit">접근 검증 실행</button>
    </form>
  </section>

  <section id="probe-result" class="content-band" aria-live="polite">
    <div class="empty-result-guide">
      <strong>검증 결과</strong>
      <ul>
        <li>토큰이 어떤 사용자와 역할로 해석됐는지 확인합니다.</li>
        <li>VPD 행 접근 정책을 지난 뒤 실제로 몇 행이 남았는지 확인합니다.</li>
        <li>ASO/Data Redaction이 어떤 민감 컬럼을 마스킹했는지 확인합니다.</li>
        <li>FGA 감사 증적이 있으면 DB가 실제 실행한 SQL과 VPD predicate를 확인합니다.</li>
      </ul>
    </div>
  </section>
</main>
</body>
</html>
