github.com/anth0d/nomad@v0.0.0-20221214183521-ae3a0a2cad06/ui/app/templates/settings/tokens.hbs (about)

     1  {{page-title "Authorization"}}
     2  <section class="section authorization-page">
     3    {{#if this.isValidatingToken}}
     4      <LoadingSpinner />
     5    {{else}}
     6      <h1 class="title">Authorization and access control</h1>
     7  
     8      <div class="status-notifications {{if this.canSignIn "is-half"}}">
     9  
    10        {{#if (eq this.signInStatus "failure")}}
    11          <div data-test-token-error class="notification is-danger">
    12            <div class="columns">
    13              <div class="column">
    14                <h3 class="title is-4">Token Failed to Authenticate</h3>
    15                <p>The token secret you have provided does not match an existing token, or has expired.</p>
    16              </div>
    17            </div>
    18          </div>
    19        {{/if}}
    20  
    21        {{#if this.tokenRecord.isExpired}}
    22          <div data-test-token-expired class="notification is-danger">
    23            <div class="columns">
    24              <div class="column">
    25                <h3 class="title is-4">Your authentication has expired</h3>
    26                <p>Expired {{moment-from-now this.tokenRecord.expirationTime interval=1000}} ({{this.tokenRecord.expirationTime}})</p>
    27              </div>
    28              <div class="column is-centered is-minimum">
    29                <button data-test-token-clear class="button" {{action "clearTokenProperties"}} type="button">Sign In Again</button>
    30              </div>
    31            </div>
    32          </div>
    33        {{else}}
    34          {{#if (eq this.signInStatus "success")}}
    35            <div data-test-token-success class="notification is-success">
    36              <div class="columns">
    37                <div class="column">
    38                  <h3 class="title is-4">Token Authenticated!</h3>
    39                  <p>Your token is valid and authorized for the following policies.</p>
    40                </div>
    41              </div>
    42            </div>
    43          {{/if}}
    44        {{/if}}
    45  
    46        {{#if this.token.tokenNotFound}}
    47          <div data-test-token-not-found class="notification is-danger">
    48            <div class="columns">
    49              <div class="column">
    50                <h3 class="title is-4">Your token was not found</h3>
    51                <p>It may have expired, or been entered incorrectly.</p>
    52              </div>
    53            </div>
    54          </div>
    55        {{/if}}
    56  
    57        {{#if this.SSOFailure}}
    58          <div data-test-sso-error class="notification is-danger column">
    59            <div class="columns">
    60              <div class="column">
    61                <h3 class="title is-4">Failed to sign in with SSO</h3>
    62                <p>Your OIDC provider has failed on sign in; please try again or contact your SSO administrator.</p>
    63              </div>
    64              <div class="column is-centered is-minimum">
    65                <button data-test-sso-error-clear class="button" {{action (mut this.state)}} type="button">Clear</button>
    66              </div>
    67            </div>
    68          </div>
    69        {{/if}}
    70      </div>
    71  
    72      <div class="columns">
    73        {{#if this.canSignIn}}
    74          <div class="column is-half sign-in-methods">
    75            {{#if this.authMethods.length}}
    76              <h3 class="title is-4">Sign in with SSO</h3>
    77              <p>Sign in to Nomad using the configured authorization provider. After logging in, the policies and rules for the token will be listed.</p>
    78              <div class="sso-auth-methods">
    79                {{#each this.model.authMethods as |method|}}
    80                  <button
    81                    data-test-auth-method
    82                    class="button is-primary"
    83                    onclick={{action "redirectToSSO" method}}
    84                    type="button"
    85                  >Sign in with with {{method.name}}
    86                  </button>
    87                {{/each}}
    88              </div>
    89              <span class="or-divider"><span>Or</span></span>
    90            {{/if}}
    91  
    92            <h3 class="title is-4">Sign in with token</h3>
    93            <p>Clusters that use Access Control Lists require tokens to perform certain tasks. By providing a token Secret ID, each future request will be authenticated, potentially authorizing read access to additional information.</p>
    94            <label class="label" for="token-input">Secret ID</label>
    95            <div class="control">
    96              <Input
    97                id="token-input"
    98                class="input"
    99                @type="text"
   100                placeholder="XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
   101                {{!-- FIXME this placeholder gets read out by VoiceOver sans dashes 😵 --}}
   102                {{autofocus}}
   103                {{on "input" (action (mut this.secret) value="target.value")}}
   104                @enter={{this.verifyToken}}
   105                data-test-token-secret />
   106            </div>
   107            <p class="help">Sent with every request to determine authorization</p>
   108            <button disabled={{not this.secret}} data-test-token-submit class="button is-primary" {{action "verifyToken"}} type="button">Set Token</button>
   109          </div>
   110        {{/if}}
   111  
   112        {{#if this.shouldShowPolicies}}
   113          <div class="column">
   114            {{#unless this.tokenRecord.isExpired}}
   115              <div class="columns">
   116                <div class="column">
   117                  <h3 data-test-token-name class="title is-4">Token: {{this.tokenRecord.name}}</h3>
   118                  <div>AccessorID: <code>{{this.tokenRecord.accessor}}</code></div>
   119                  <div>SecretID: <code>{{this.tokenRecord.secret}}</code></div>
   120                  {{#if this.tokenRecord.expirationTime}}
   121                    <div data-test-token-expiry>Expires: {{moment-from-now this.tokenRecord.expirationTime interval=1000}} <span data-test-expiration-timestamp>({{this.tokenRecord.expirationTime}})</span></div>
   122                  {{/if}}
   123                </div>
   124                <div class="column is-minimum">
   125                  <button data-test-token-clear class="button is-primary" {{action "clearTokenProperties"}} type="button">Sign Out</button>
   126                </div>
   127              </div>
   128              <h3 class="title is-4">Policies</h3>
   129              {{#if (eq this.tokenRecord.type "management")}}
   130                <div data-test-token-management-message class="boxed-section">
   131                  <div class="boxed-section-body has-centered-text">
   132                    The management token has all permissions
   133                  </div>
   134                </div>
   135              {{else}}
   136                {{#each this.tokenRecord.policies as |policy|}}
   137                  <div data-test-token-policy class="boxed-section">
   138                    <div data-test-policy-name class="boxed-section-head">
   139                      {{policy.name}}
   140                    </div>
   141                    <div class="boxed-section-body">
   142                      <p data-test-policy-description class="content">
   143                        {{#if policy.description}}
   144                          {{policy.description}}
   145                        {{else}}
   146                          <em>No description</em>
   147                        {{/if}}
   148                      </p>
   149                      <pre><code data-test-policy-rules>{{policy.rules}}</code></pre>
   150                    </div>
   151                  </div>
   152                {{/each}}
   153              {{/if}}
   154            {{/unless}}
   155          </div>
   156        {{/if}}
   157      </div>
   158  
   159    {{/if}}
   160  </section>
   161