{#-
       Licensed to the Apache Software Foundation (ASF) under one
       or more contributor license agreements.  See the NOTICE file
       distributed with this work for additional information
       regarding copyright ownership.  The ASF licenses this file
       to you under the Apache License, Version 2.0 (the
       "License"); you may not use this file except in compliance
       with the License.  You may obtain a copy of the License at

         http://www.apache.org/licenses/LICENSE-2.0

       Unless required by applicable law or agreed to in writing,
       software distributed under the License is distributed on an
       "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
       KIND, either express or implied.  See the License for the
       specific language governing permissions and limitations
       under the License.
-#}
{% set hide_left_bar = True %}
{% set current_menu_item = '/auth/preferences' %}
{% extends "allura:templates/user_account_base.html" %}

{% block title %}{{c.user.username}} / Recovery Codes for Multifactor Authentication{% endblock %}

{% block header %}Recovery Codes for Multifactor Authentication{% endblock %}


{% macro plaintext(codes) %}
{{- config['site_name'] }} Recovery Codes:
{% for code in codes %}
{{ code -}}
{% endfor %}
{% endmacro %}

{% block content %}
  {{ super() }}
  <div class='grid-20'>
    <h2 class="subtitle">Your {{ config['site_name'] }} Recovery Codes</h2>
    <p>
        <a href="#" class="print"><strong>Print</strong></a> these!
        <a href="{{ h.base64uri(plaintext(codes), mimetype='text/plain', windows_line_endings=windows_line_endings) }}" download="{{ config['site_name'] }} recovery codes.txt" class="download"><strong>Download</strong></a> them!
        Keep them safe.
    </p>
    <p>
        It is essential to keep a copy of these recovery codes, otherwise you may get permanently locked out of your account, if you lose
        your authenticator device.
    </p>
    <p>
        <a href="/auth/preferences/">Back to Account Settings</a>
    </p>
    <hr>
    <p class="codes">
    {% for code in codes %}
        {{ code }}<br>
    {% endfor %}
    </p>
    <hr>
    <form action="multifactor_recovery_regen" id="multifactor_recovery_regen" method="post">
        <p>
            If you regenerate your recovery codes, your old ones will not work any more.
            You will need to save the new ones.
        </p>
        <p>
            <input type="submit" value="Regenerate Codes">
        </p>
        {{ lib.csrf_token() }}
    </form>
  </div>
{% endblock %}

{% block extra_css %}
<style type="text/css">
p.codes {
    -moz-columns: 2;
    columns: 2;
    font-size: 300%;
    line-height: 125%;
    padding-bottom: 0;
}
@media print {
    /* don't show link destinations */
    a:after {
        content: '';
    }
}
</style>
{% endblock %}


{% block extra_js %}
<script type="text/javascript">
$(function() {
    $('#multifactor_recovery_regen').submit(function(e) {
        var ok = confirm('Are you sure you want to regenerate your recovery codes?');
        if(!ok) {
            e.preventDefault();
        }
    });
    $('.print').click(function(e) {
        window.print();
    });
    if (window.navigator.msSaveBlob) {
        // IE doesn't support base64 links or the download attr, so use its msSaveBlob
        $('.download').click(function(e) {
            e.preventDefault();
            var fileData = $('.subtitle').text() + '\n\n' + $('.codes').text();
            fileData = fileData.replace(new RegExp('\n', 'g'), '\r\n');
            blobObject = new Blob([fileData]);
            var fileName = $('.download').attr('download');
            window.navigator.msSaveBlob(blobObject, fileName);
        });
    }
});
</script>
{% endblock %}
