{#-
       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 %} Authorize third-party application? {% endblock %}

{% block header %}Authorize third party application?{% endblock %}

{% block content %}
<p>
  {% if name %}
    The application {{ name }} wishes to access your account using the {{ consumer.name }} key.
  {% else %}
    The application {{ consumer.name }} wishes to access your account.
  {% endif %}
  If you grant them access, they will be able to perform any actions on
  the site as though they were logged in as you.  Do you wish to grant
  them access?
</p>
<form method="POST" action="do_authorize">
  <input type="hidden" name="oauth_token" value="{{oauth_token}}"/>
  <input type="submit" name="no" value="No, do not authorize {{ consumer.name }}">
  <input type="submit" name="yes" value="Yes, authorize {{ consumer.name }}"><br>
  {{lib.csrf_token()}}
</form>
<br style="clear:both"/>
<h2>{{consumer.name}}</h2>
<h3>Description</h3>
{{consumer.description_html|safe}}
{% endblock %}
