rustsec-admin 0.8.9

Admin utility for maintaining the RustSec Advisory Database
Documentation
  <article>
    {% match advisory.metadata.collection %}
    {% when Some with (collection) %}
        <span class="floating-menu">
          <a href="https://github.com/RustSec/advisory-db/commits/main/{{ collection }}/{{ advisory.metadata.package }}/{{ advisory.id() }}.md">History</a><a href="https://github.com/RustSec/advisory-db/edit/main/{{ collection }}/{{ advisory.metadata.package }}/{{ advisory.id() }}.md">Edit</a><a href="https://api.osv.dev/v1/vulns/{{ advisory.id() }}">JSON (OSV)</a>
        </span>
    {% when None %}
    {% endmatch %}

    <header>
      <h1>
        {% if advisory.withdrawn() %}
        <span class="withdrawn">{{ advisory.id() }}</span>
        {% else %}
        {{ advisory.id() }}
        {% endif %}
      </h1>
      <span class="subtitle">{{ rendered_title|safe }}</span>
    </header>

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

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

      <dt id="issued">Issued</dt>
      <dd>
        <time datetime="{{ cdate.as_str() }}">
          {{ cdate.clone() | friendly_date }}
        </time>
        {% if cdate != mdate %}
        <time datetime="{{ mdate.as_str() }}">
          (last modified: {{ mdate.clone() | friendly_date }})
        </time>
        {% endif %}
      </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) %}
        <span class="tag info">INFO</span>
        {{ 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><a href="/categories/{{ category.to_string() }}.html">{{ category.to_string() }}</a></li>
          {% endfor %}
        </ul>
      </dd>
      {% endif %}

      {% if advisory.metadata.keywords.len() > 0 %}
      <dt id="keywords">Keywords</dt>
      <dd>
        {% for keyword in advisory.metadata.keywords %}
          <a href="/keywords/{{ keyword.as_str() | safe_keyword }}.html">#{{ keyword.as_str() | safe_keyword }}</a>
        {% endfor %}
      </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() || !advisory.metadata.references.is_empty() %}
      <dt id="details">References</dt>
      <dd>
        <ul>
        {% if advisory.metadata.url.is_some() %}
          <li>
            <a href="{{ advisory.metadata.url.as_ref().unwrap() }}">
              {{ advisory.metadata.url.as_ref().unwrap() }}
            </a>
          </li>
        {% endif %}
        {% for reference in advisory.metadata.references %}
          <li>
            <a href="{{ reference }}">
              {{ reference }}
            </a>
          </li>
        {% endfor %}
        </ul>
      </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_score">CVSS Score</dt>
      <dd>{{ cvss.score().value() }} <span class="tag {{ advisory.severity().unwrap() }}">
        {{ advisory.severity().unwrap() | upper }}
      </span></dd>

      <dt id="cvss_details">CVSS Details</dt>
      <dd>
        <dl>
          {% match cvss.av %}
          {% when Some with (av) %}
          <dt>Attack vector</dt><dd>{{ "{:?}"|format(av) }}</dd>
          {% when None %}
          {% endmatch %}

          {% match cvss.ac %}
          {% when Some with (ac) %}
          <dt>Attack complexity</dt><dd>{{ "{:?}"|format(ac) }}</dd>
          {% when None %}
          {% endmatch %}

          {% match cvss.pr %}
          {% when Some with (pr) %}
          <dt>Privileges required</dt><dd>{{ "{:?}"|format(pr) }}</dd>
          {% when None %}
          {% endmatch %}

          {% match cvss.ui %}
          {% when Some with (ui) %}
          <dt>User interaction</dt><dd>{{ "{:?}"|format(ui) }}</dd>
          {% when None %}
          {% endmatch %}

          {% match cvss.s %}
          {% when Some with (s) %}
          <dt>Scope</dt><dd>{{ "{:?}"|format(s) }}</dd>
          {% when None %}
          {% endmatch %}

          {% match cvss.c %}
          {% when Some with (c) %}
          <dt>Confidentiality</dt><dd>{{ "{:?}"|format(c) }}</dd>
          {% when None %}
          {% endmatch %}

          {% match cvss.i %}
          {% when Some with (i) %}
          <dt>Integrity</dt><dd>{{ "{:?}"|format(i) }}</dd>
          {% when None %}
          {% endmatch %}

          {% match cvss.a %}
          {% when Some with (a) %}
          <dt>Availability</dt><dd>{{ "{:?}"|format(a) }}</dd>
          {% when None %}
          {% endmatch %}
        </dl>
      </dd>

      <dt id="cvss">CVSS Vector</dt>
      <dd><a href="https://nvd.nist.gov/vuln-metrics/cvss/v3-calculator?vector={{ cvss }}">{{ cvss }}</a></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 %}

      {% 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 }}

    <p id="license" class="license">Advisory available under <a href="https://spdx.org/licenses/{{ advisory.metadata.license.spdx() }}.html">{{ advisory.metadata.license.spdx() }}</a>
    license.

    {% if advisory.metadata.license == rustsec::advisory::License::CcBy40 %}
      {# License requires attribution, make it explicit #}
      {% match advisory.metadata.url %}
        {% when Some with (url) %}
          Source: <a href="{{ url }}">{{ url }}</a>
        {% when None %}
      {% endmatch %}
    {% endif %}
    </p>
  </article>