rustsec-admin 0.4.3

Admin utility for maintaining the RustSec Advisory Database
  <article>
    <header>
      <h1>
        {% if advisory.metadata.yanked %}
        <span class="yanked">{{ advisory.id() }}</span>
        {% else %}
        {{ advisory.id() }}
        {% endif %}
      </h1>
      <span class="subtitle">{{ rendered_title|safe }}</span>
    </header>

    {% if advisory.metadata.yanked %}
    <hr>
    <p class="warning">This advisory has been yanked and should be ignored. It is kept only for reference.</p>
    <hr>
    {% endif %}

    <dl>
      <dt id="issued">Issued</dt>
      <dd>
        <time datetime="{{ advisory.date().as_str() }}">
          {{ advisory.date() | friendly_date }}
        </time>
      </dd>

      <dt id="package">Package</dt>
      <dd>
        {% match advisory.metadata.collection %}
        {% when Some with (collection) %}
        {% if collection.to_string() == "crates" %}
        <a href="/packages/{{ advisory.metadata.package }}.html">{{ advisory.metadata.package }}</a>
          (<a href="https://crates.io/crates/{{ advisory.metadata.package }}">crates.io</a>)
        {% else %}
        <code><a href="/packages/{{ advisory.metadata.package }}.html">{{ advisory.metadata.package }}</a></code>
        {% endif %}
        {% when None %}
        <code><a href="/packages/{{ advisory.metadata.package }}.html">{{ advisory.metadata.package }}</a></code>
        {% endmatch %}
      </dd>

      <dt id="type">Type</dt>
      <dd>
        {% match advisory.metadata.informational %}
        {% when Some with (informational) %}
        {{ informational.to_string() | capitalize }}
        {% when None %}
        Vulnerability
        {% endmatch %}
      </dd>

      {% if advisory.metadata.categories.len() > 0 %}
      <dt id="categories">Categories</dt>
      <dd>
        <ul>
          {% for category in advisory.metadata.categories %}
          <li>{{ category.to_string() }}</li>
          {% endfor %}
        </ul>
      </dd>
      {% endif %}

      {% if advisory.metadata.aliases.len() > 0 %}
      <dt id="aliases">Aliases</dt>
      <dd>
        <ul>
          {% for id in advisory.metadata.aliases %}
          <li>
            {% match id.url() %}
            {% when Some with (url) %}
            <a href="{{ url }}">{{ id }}</a>
            {% when None %}
            {{ id }}
            {% endmatch %}
          </li>
          {% endfor %}
        </ul>
      </dd>
      {% endif %}

      {% if advisory.metadata.url.is_some() %}
      <dt id="details">Details</dt>
      <dd>
        <a href="{{ advisory.metadata.url.as_ref().unwrap() }}">
          {{ advisory.metadata.url.as_ref().unwrap() }}
        </a>
      </dd>
      {% endif %}

      {% if advisory.metadata.related.len() > 0 %}
      <dt id="related">Related</dt>
      <dd>
        <ul>
          {% for id in advisory.metadata.related %}
          <li>
            {% match id.url() %}
            {% when Some with (url) %}
            <a href="{{ url }}">{{ id }}</a>
            {% when None %}
            {{ id }}
            {% endmatch %}
          </li>
          {% endfor %}
        </ul>
      </dd>
      {% endif %}

      {% match advisory.metadata.cvss %}
      {% when Some with (cvss) %}
      <dt id="cvss">CVSS</dt>
      <dd>{{ cvss }}</dd>
      {% when None %}
      {% endmatch %}

      <dt id="patched">Patched</dt>
      <dd>
        {% if advisory.versions.patched.len() == 0 %}
        no patched versions
        {% else %}
        <ul>
          {% for patched in advisory.versions.patched %}
          <li><code>{{ patched }}</code></li>
          {% endfor %}
        </ul>
        {% endif %}
      </dd>

      {% if advisory.versions.unaffected.len() > 0 %}
      <dt id="unaffected">Unaffected</dt>
      <dd>
        <ul>
          {% for unaffected in advisory.versions.unaffected %}
          <li><code>{{ unaffected }}</code></li>
          {% endfor %}
        </ul>
      </dd>
      {% endif %}

      {% if advisory.metadata.keywords.len() > 0 %}
      <dt id="keywords">Keywords</dt>
      <dd>
        <ul>
          {% for keyword in advisory.metadata.keywords %}
          <li>{{ keyword.as_str() }}</li>
          {% endfor %}
        </ul>
      </dd>
      {% endif %}

      {% match advisory.affected %}
      {% when Some with (affected) %}
      {% if affected.arch.len() > 0 %}
      <dt>Affected Architectures</dt>
      <dd>
        <ul>
          {% for arch in affected.arch %}
          <li><code>{{ arch }}</code></li>
          {% endfor %}
        </ul>
      </dd>
      {% endif %}

      {% if affected.os.len() > 0 %}
      <dt>Affected OSes</dt>
      <dd>
        <ul>
          {% for os in affected.os %}
          <li><code>{{ os }}</code></li>
          {% endfor %}
        </ul>
      </dd>
      {% endif %}
      {% when None %}
      {% endmatch %}
    </dl>

    {% match advisory.affected %}
    {% when Some with (affected) %}
    {% if affected.functions.len() > 0 %}
    <dl>
      <dt>Affected Functions</dt>
      <dd>Version</dd>
      {% for function in affected.functions %}
      <dt><code>{{ function.0 }}</code></dt>
      <dd>
        <ul>
          {% for version_req in function.1 %}
          <li><code>{{ version_req }}</code></li>
          {% endfor %}
        </ul>
      </dd>
      {% endfor %}
    </dl>
    {% endif %}

    {% when None %}
    {% endmatch %}

    <h3 id="description">Description</h3>
    {{ rendered_description|safe }}

    {% match advisory.metadata.collection %}
    {% when Some with (collection) %}
    <h3 id="more">More</h3>

    <ul>
      <li><a
          href="https://github.com/RustSec/advisory-db/commits/main/{{ collection }}/{{ advisory.metadata.package }}/{{ advisory.id() }}.md">Advisory
          History</a></li>
      <li><a
          href="https://github.com/RustSec/advisory-db/edit/main/{{ collection }}/{{ advisory.metadata.package }}/{{ advisory.id() }}.md">Edit
          Advisory</a></li>
    </ul>
    {% when None %}
    {% endmatch %}
  </article>