{#-
       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 %}
{% extends g.theme.master %}

{% block title %}Forgotten password recovery{% endblock %}

{% block header %}Forgotten password recovery{% endblock %}

{% block content %}
<div class="grid-20">
  {% if c.forgotten_password_form %}
    {{ c.forgotten_password_form.display(action="./password_recovery_hash") }}
  {% endif %}

  {% if c.recover_password_change_form %}
    <p>Enter a new password for: {{ user_record.username }}</p>
    {{ c.recover_password_change_form.display(action="../set_new_password/" + hash if hash else '') }}
  {% endif %}
</div>
{% endblock %}
