return extra_validation_passes
-def get_login_form(request):
- return hook_handle("auth_get_login_form", request)
-
-
-def get_registration_form(request):
- return hook_handle("auth_get_registration_form", request)
-
-
def gen_password_hash(raw_pass, extra_salt=None):
return hook_handle("auth_gen_password_hash", raw_pass, extra_salt)
def check_password(raw_pass, stored_hash, extra_salt=None):
return hook_handle("auth_check_password",
raw_pass, stored_hash, extra_salt)
-
-
-def fake_login_attempt():
- return hook_handle("auth_fake_login_attempt")
class ChangePassForm(wtforms.Form):
password = wtforms.PasswordField(
- 'Password',
- [wtforms.validators.Required(),
- wtforms.validators.Length(min=5, max=1024)])
+ 'Password')
userid = wtforms.HiddenField(
'',
[wtforms.validators.Required()])
user = auth.get_user(username=username)
if not user:
_log.info("User %r not found", username)
- auth.fake_login_attempt()
+ hook_handle("auth_fake_login_attempt")
return None
if not auth.check_password(password, user.pw_hash):
_log.warn("Wrong password for %r", username)
return user
-class AuthError(Exception):
- def __init__(self):
- self.value = 'No Authentication Plugin is enabled and' \
- ' authentication_disabled = False in config!'
-
- def __str__(self):
- return repr(self.value)
-
-
def check_auth_enabled():
- authentication_disabled = mg_globals.app_config['authentication_disabled']
- auth_plugin = hook_handle('authentication')
-
- if authentication_disabled is False and not auth_plugin:
- raise AuthError
-
- if authentication_disabled:
+ if not hook_handle('authentication'):
_log.warning('No authentication is enabled')
return False
else:
from mediagoblin.tools.response import render_to_response, redirect, render_404
from mediagoblin.tools.translate import pass_to_ugettext as _
from mediagoblin.tools.mail import email_debug_message
+from mediagoblin.tools.pluginapi import hook_handle
from mediagoblin.auth import forms as auth_forms
from mediagoblin.auth.tools import (send_verification_email, register_user,
send_fp_verification_email,
return redirect(request, "index")
if 'pass_auth' not in request.template_env.globals:
- if 'openid' in request.template_env.globals:
- return redirect(request, 'mediagoblin.plugins.openid.register')
+ redirect_name = hook_handle('auth_no_pass_redirect')
+ return redirect(request, 'mediagoblin.plugins.{0}.register'.format(
+ redirect_name))
- register_form = auth.get_registration_form(request)
+ register_form = hook_handle("auth_get_registration_form", request)
if request.method == 'POST' and register_form.validate():
# TODO: Make sure the user doesn't exist already
request,
'mediagoblin/auth/register.html',
{'register_form': register_form,
- 'focus': 'username',
'post_url': request.urlgen('mediagoblin.auth.register')})
return redirect(request, 'index')
if 'pass_auth' not in request.template_env.globals:
- if 'openid' in request.template_env.globals:
- return redirect(request, 'mediagoblin.plugins.openid.login')
+ redirect_name = hook_handle('auth_no_pass_redirect')
+ return redirect(request, 'mediagoblin.plugins.{0}.login'.format(
+ redirect_name))
- login_form = auth.get_login_form(request)
+ login_form = hook_handle("auth_get_login_form", request)
login_failed = False
{'login_form': login_form,
'next': request.GET.get('next') or request.form.get('next'),
'login_failed': login_failed,
- 'focus': 'username',
'post_url': request.urlgen('mediagoblin.auth.login'),
'allow_registration': mg_globals.app_config["allow_registration"]})
if not (request.method == 'POST' and fp_form.validate()):
# Either GET request, or invalid form submitted. Display the template
return render_to_response(request,
- 'mediagoblin/auth/forgot_password.html', {'fp_form': fp_form,
- 'focus': 'username'})
+ 'mediagoblin/auth/forgot_password.html', {'fp_form': fp_form,})
# If we are here: method == POST and form is valid. username casing
# has been sanitized. Store if a user was found by email. We should
return render_to_response(
request,
'mediagoblin/auth/change_fp.html',
- {'cp_form': cp_form,
- 'focus': 'password'})
+ {'cp_form': cp_form,})
# in case there is a valid id but no user with that id in the db
# or the token expired
# Set to false to disable registrations
allow_registration = boolean(default=True)
-# Set to true to run an instance with no authentication plugins enabled.
-# You will not be able to login or register
-authentication_disabled = boolean(default=False)
-
# tag parsing
tags_max_length = integer(default=255)
user_table.c.pw_hash.alter(nullable=True)
+ if db.bind.url.drivername is 'sqlite':
+ constraint = UniqueConstraint('username', table=user_table)
+ constraint.create()
+
db.commit()
[wtforms.validators.Required(),
normalize_user_or_email_field()])
password = wtforms.PasswordField(
- _('Password'),
- [wtforms.validators.Required(),
- wtforms.validators.Length(min=5, max=1024)])
+ _('Password'))
{{ csrf_token }}
<div class="form_box">
<h1>{% trans %}Set your new password{% endtrans %}</h1>
- {{ wtforms_util.render_divs(cp_form) }}
+ {{ wtforms_util.render_divs(cp_form, True) }}
<div class="form_submit_buttons">
<input type="submit" value="{% trans %}Set password{% endtrans %}" class="button_form"/>
</div>
</div>
-</form><!-- Focus the field passed in with the focus arg-->
-<script>$(document).ready(function(){$({{ focus }}).focus();});</script>
{% endblock %}
{{ csrf_token }}
<div class="form_box">
<h1>{% trans %}Recover password{% endtrans %}</h1>
- {{ wtforms_util.render_divs(fp_form) }}
+ {{ wtforms_util.render_divs(fp_form, True) }}
<div class="form_submit_buttons">
<input type="submit" value="{% trans %}Send instructions{% endtrans %}" class="button_form"/>
</div>
</div>
</form>
-<!-- Focus the field passed in with the focus arg-->
-<script>$(document).ready(function(){$({{ focus }}).focus();});</script>
{% endblock %}
{%- trans %}Create one here!{% endtrans %}</a>
</p>
{% endif %}
- {{ wtforms_util.render_divs(login_form) }}
+ {{ wtforms_util.render_divs(login_form, True) }}
{% if pass_auth %}
<p>
<a href="{{ request.urlgen('mediagoblin.auth.forgot_password') }}" id="forgot_password">
{% endif %}
</div>
</form>
-<!-- Focus the field passed in with the focus arg-->
-<script>$(document).ready(function(){$({{ focus }}).focus();});</script>
{% endblock %}
method="POST" enctype="multipart/form-data">
<div class="form_box">
<h1>{% trans %}Create an account!{% endtrans %}</h1>
- {{ wtforms_util.render_divs(register_form) }}
+ {{ wtforms_util.render_divs(register_form, True) }}
{{ csrf_token }}
<div class="form_submit_buttons">
<input type="submit" value="{% trans %}Create{% endtrans %}"
</div>
</div>
</form>
-<!-- Focus the field passed in with the focus arg-->
-<script>$(document).ready(function(){$({{ focus }}).focus();});</script>
{% endblock %}
{%- endmacro %}
{# Generically render a field #}
-{% macro render_field_div(field) %}
+{% macro render_field_div(field, autofocus_first=False) %}
{{- render_label_p(field) }}
<div class="form_field_input">
- {{ field }}
+ {% if autofocus_first %}
+ {{ field(autofocus=True) }}
+ {% else %}
+ {{ field }}
+ {% endif %}
{%- if field.errors -%}
{% for error in field.errors %}
<p class="form_field_error">{{ error }}</p>
{%- endmacro %}
{# Auto-render a form as a series of divs #}
-{% macro render_divs(form) -%}
+{% macro render_divs(form, autofocus_first=False) -%}
{% for field in form %}
- {{ render_field_div(field) }}
+ {% if autofocus_first and loop.first %}
+ {{ render_field_div(field, True) }}
+ {% else %}
+ {{ render_field_div(field) }}
+ {% endif %}
{% endfor %}
{%- endmacro %}
direct_remote_path = /test_static/
email_sender_address = "notice@mediagoblin.example.org"
email_debug_mode = true
-authentication_disabled = true
# TODO: Switch to using an in-memory database
sql_engine = "sqlite:///%(here)s/user_dev/mediagoblin.db"
direct_remote_path = /test_static/
email_sender_address = "notice@mediagoblin.example.org"
email_debug_mode = true
-authentication_disabled = true
# TODO: Switch to using an in-memory database
sql_engine = "sqlite:///%(here)s/user_dev/mediagoblin.db"
direct_remote_path = /test_static/
email_sender_address = "notice@mediagoblin.example.org"
email_debug_mode = true
-authentication_disabled = true
# TODO: Switch to using an in-memory database
sql_engine = "sqlite:///%(here)s/user_dev/mediagoblin.db"
+++ /dev/null
-[mediagoblin]
-direct_remote_path = /test_static/
-email_sender_address = "notice@mediagoblin.example.org"
-email_debug_mode = true
-
-# TODO: Switch to using an in-memory database
-sql_engine = "sqlite:///%(here)s/user_dev/mediagoblin.db"
-
-# Celery shouldn't be set up by the application as it's setup via
-# mediagoblin.init.celery.from_celery
-celery_setup_elsewhere = true
-
-[storage:publicstore]
-base_dir = %(here)s/user_dev/media/public
-base_url = /mgoblin_media/
-
-[storage:queuestore]
-base_dir = %(here)s/user_dev/media/queue
-
-[celery]
-CELERY_ALWAYS_EAGER = true
-CELERY_RESULT_DBURI = "sqlite:///%(here)s/user_dev/celery.db"
-BROKER_HOST = "sqlite:///%(here)s/user_dev/kombu.db"
-
-[plugins]
from mediagoblin.db.models import User
from mediagoblin.tests.tools import get_app, fixture_add_user
from mediagoblin.tools import template, mail
-from mediagoblin.auth.tools import AuthError
from mediagoblin.auth import tools as auth_tools
context = template.TEMPLATE_TEST_CONTEXT['mediagoblin/auth/login.html']
form = context['login_form']
assert form.username.errors == [u'This field is required.']
- assert form.password.errors == [u'This field is required.']
# Failed login - blank user
# -------------------------
response = test_app.post(
'/auth/login/', {
'username': u'chris'})
- context = template.TEMPLATE_TEST_CONTEXT['mediagoblin/auth/login.html']
- form = context['login_form']
- assert form.password.errors == [u'This field is required.']
+ assert 'mediagoblin/auth/login.html' in template.TEMPLATE_TEST_CONTEXT
# Failed login - bad user
# -----------------------
assert urlparse.urlsplit(response.location)[2] == '/u/chris/'
-# App with authentication_disabled and no auth plugin enabled
-def no_auth_plugin_app(request):
- return get_app(
- request,
- mgoblin_config=pkg_resources.resource_filename(
- 'mediagoblin.tests.auth_configs',
- 'no_auth_plugin_appconfig.ini'))
-
-
-def test_auth_plugin_raises(request):
- with pytest.raises(AuthError):
- no_auth_plugin_app(request)
-
-
@pytest.fixture()
def authentication_disabled_app(request):
return get_app(