pixelfed/pixelfed

View on GitHub
resources/views/settings/security/2fa/setup.blade.php

Summary

Maintainability
A
0 mins
Test Coverage
@extends('layouts.app')

@section('content')
<div class="container">
  <div class="col-12">
    <div class="card shadow-none border mt-5">
      <div class="card-body">
        <div class="row">
          <div class="col-12 p-3 p-md-5">
              <div class="title">
                <h3 class="font-weight-bold">Setup Two-Factor Authentication</h3>
              </div>
              <hr>
              <div class="alert alert-info font-weight-light mb-3">
                  We only support Two-Factor Authentication via TOTP mobile apps.
              </div>
              <section class="step-one pb-5">
                  <div class="sub-title font-weight-bold h5" data-toggle="collapse" data-target="#step1" aria-expanded="true" aria-controls="step1" data-step="1">
                      Step 1: Install compatible 2FA mobile app <i class="float-right fas fa-chevron-down"></i>
                  </div>
                  <hr>
                  <div class="collapse show" id="step1">
                      <p>You will need to install a compatible mobile app, we recommend the following apps:</p>
                      <ul>
                          <li><a href="https://1password.com/downloads/" rel="nooopener nofollow">1Password</a></li>
                          <li><a href="https://authy.com/download/" rel="nooopener nofollow">Authy</a></li>
                          <li><a href="https://lastpass.com/auth/" rel="nooopener nofollow">LastPass Authenticator</a></li>
                          <li>
                              Google Authenticator
                              <a class="small" href="https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2&hl=en_CA" rel="nooopener nofollow">
                                  (android)
                              </a>
                              <a class="small" href="https://itunes.apple.com/ca/app/google-authenticator/id388497605?mt=8" rel="nooopener nofollow">
                                  (iOS)
                              </a>
                          </li>
                          <li><a href="https://www.microsoft.com/en-us/account/authenticator" rel="nooopener nofollow">Microsoft Authenticator</a></li>
                      </ul>
                  </div>
              </section>

              <section class="step-two pb-5">
                  <div class="sub-title font-weight-bold h5" data-toggle="collapse" data-target="#step2" aria-expanded="false" aria-controls="step2" data-step="2">
                      Step 2: Scan QR Code and confirm <i class="float-right fas fa-chevron-down"></i>
                  </div>
                  <hr>
                  <div class="collapse" id="step2">
                      <p>Please scan the QR code and then enter the 6 digit code in the form below. Keep in mind the code changes every 30 seconds, and is only good for 1 minute.</p>
                      <div class="card">
                          <div class="card-body text-center">
                              <div class="pb-3">
                                  <p class="font-weight-bold">QR Code</p>
                                  {!!$qrcode!!}
                              </div>
                              <div>
                                  <p class="font-weight-bold">OTP Secret</p>
                                  <input type="text" class="form-control" value="{{ $user->{'2fa_secret'} }}" disabled>
                              </div>
                          </div>
                          <div class="card-body">
                              <form id="confirm-code">
                                  <div class="form-group">
                                      <label class="font-weight-bold small">Code</label>
                                      <input type="text" name="code" id="verifyCode" class="form-control" placeholder="Code" autocomplete="off">
                                  </div>
                                  <button type="submit" class="btn btn-primary font-weight-bold">Submit</button>
                              </form>
                          </div>
                      </div>
                  </div>
              </section>

              <section class="step-three pb-5">
                  <div class="sub-title font-weight-bold h5" data-toggle="collapse" data-target="#step3" aria-expanded="true" aria-controls="step3" data-step="3">
                      Step 3: Download Backup Codes <i class="float-right fas fa-chevron-down"></i>
                  </div>
                  <hr>
                  <div class="collapse" id="step3">
                      <p>Please store the following codes in a safe place, each backup code can be used only once if you do not have access to your 2FA mobile app.</p>

                      <code>
                      @foreach($backups as $code)
                      <p class="mb-0">{{$code}}</p>
                      @endforeach
                      </code>
                  </div>
              </section>

            </div>
        </div>
      </div>
    </div>
  </div>
</div>
@endsection

@push('scripts')
<script type="text/javascript">
$(document).ready(function() {
    $('#step3').addClass('d-none');
    window.twoFactor = {};
    window.twoFactor.validated = false;

    $(document).on('click', 'div[data-toggle=collapse]', function(e) {
        let el = $(this);
        let step = el.data('step');

        switch(step) {
            case 1:
                $('#step2').collapse('hide');
                $('#step3').collapse('hide');
            break;
            case 2:
                $('#step1').collapse('hide');
                $('#step3').collapse('hide');
            break;
            case 3:
                if(twoFactor.validated == false) {
                    e.preventDefault();
                    return;
                } else {
                    $('#step3').removeClass('d-none');
                    $('#step1').collapse('hide');
                    $('#step2').collapse('hide');
                }
            break;
        }
    });

    $(document).on('submit', '#confirm-code', function(e) {
        e.preventDefault();
        let el = $(this);
        let code = $('#verifyCode').val();
        if(code.length < 5) {
            swal('Oops!', 'You need to enter a valid code', 'error');
            return;
        }
        axios.post(window.location.href, {
            code: code
        }).then((res) => {
            twoFactor.validated = true;
            $('#step3').removeClass('d-none');
            $('#step3').collapse('show');
            $('#step1').collapse('hide');
            $('#step2').collapse('hide');
        }).catch((res) => {
            swal('Oops!', 'That was an invalid code, please try again.', 'error');
            return;
        });
    });
});
</script>
@endpush