2020-04-06 05:27:05 -05:00
|
|
|
##########################################################################
|
|
|
|
#
|
|
|
|
# pgAdmin 4 - PostgreSQL Tools
|
|
|
|
#
|
|
|
|
# Copyright (C) 2013 - 2020, The pgAdmin Development Team
|
|
|
|
# This software is released under the PostgreSQL Licence
|
|
|
|
#
|
|
|
|
##########################################################################
|
|
|
|
|
|
|
|
"""Implements Internal Authentication"""
|
|
|
|
|
|
|
|
import six
|
|
|
|
from flask import current_app
|
|
|
|
from flask_security import login_user
|
|
|
|
from abc import abstractmethod, abstractproperty
|
|
|
|
from flask_babelex import gettext
|
|
|
|
|
|
|
|
from .registry import AuthSourceRegistry
|
|
|
|
from pgadmin.model import User
|
|
|
|
|
|
|
|
|
|
|
|
@six.add_metaclass(AuthSourceRegistry)
|
|
|
|
class BaseAuthentication(object):
|
|
|
|
|
|
|
|
DEFAULT_MSG = {
|
|
|
|
'USER_DOES_NOT_EXIST': 'Specified user does not exist',
|
|
|
|
'LOGIN_FAILED': 'Login failed',
|
|
|
|
'EMAIL_NOT_PROVIDED': 'Email/Username not provided',
|
|
|
|
'PASSWORD_NOT_PROVIDED': 'Password not provided'
|
|
|
|
}
|
|
|
|
|
|
|
|
@abstractproperty
|
2020-04-08 08:05:45 -05:00
|
|
|
def get_friendly_name(self):
|
2020-04-06 05:27:05 -05:00
|
|
|
pass
|
|
|
|
|
|
|
|
@abstractmethod
|
2020-04-08 08:05:45 -05:00
|
|
|
def authenticate(self):
|
2020-04-06 05:27:05 -05:00
|
|
|
pass
|
|
|
|
|
|
|
|
def validate(self, form):
|
|
|
|
username = form.data['email']
|
|
|
|
password = form.data['password']
|
|
|
|
|
|
|
|
if username is None or username == '':
|
|
|
|
form.email.errors = list(form.email.errors)
|
|
|
|
form.email.errors.append(gettext(
|
|
|
|
self.messages('EMAIL_NOT_PROVIDED')))
|
|
|
|
return False
|
|
|
|
if password is None or password == '':
|
|
|
|
form.password.errors = list(form.password.errors)
|
|
|
|
form.password.errors.append(
|
|
|
|
self.messages('PASSWORD_NOT_PROVIDED'))
|
|
|
|
return False
|
|
|
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
def login(self, form):
|
|
|
|
username = form.data['email']
|
|
|
|
user = getattr(form, 'user', None)
|
|
|
|
|
|
|
|
if user is None:
|
|
|
|
user = User.query.filter_by(username=username).first()
|
|
|
|
|
|
|
|
if user is None:
|
|
|
|
current_app.logger.exception(
|
|
|
|
self.messages('USER_DOES_NOT_EXIST'))
|
|
|
|
return False, self.messages('USER_DOES_NOT_EXIST')
|
|
|
|
|
|
|
|
# Login user through flask_security
|
|
|
|
status = login_user(user)
|
|
|
|
if not status:
|
|
|
|
current_app.logger.exception(self.messages('LOGIN_FAILED'))
|
|
|
|
return False, self.messages('LOGIN_FAILED')
|
|
|
|
return True, None
|
|
|
|
|
|
|
|
def messages(self, msg_key):
|
|
|
|
return self.DEFAULT_MSG[msg_key] if msg_key in self.DEFAULT_MSG\
|
|
|
|
else None
|
|
|
|
|
|
|
|
|
|
|
|
class InternalAuthentication(BaseAuthentication):
|
|
|
|
|
2020-04-08 08:05:45 -05:00
|
|
|
def get_friendly_name(self):
|
2020-04-06 05:27:05 -05:00
|
|
|
return gettext("internal")
|
|
|
|
|
|
|
|
def validate(self, form):
|
|
|
|
"""User validation"""
|
|
|
|
|
|
|
|
# Flask security validation
|
|
|
|
return form.validate_on_submit()
|
|
|
|
|
|
|
|
def authenticate(self, form):
|
|
|
|
username = form.data['email']
|
|
|
|
user = getattr(form, 'user',
|
|
|
|
User.query.filter_by(username=username).first())
|
|
|
|
if user and user.is_authenticated and form.validate_on_submit():
|
|
|
|
return True, None
|
|
|
|
return False, self.messages('USER_DOES_NOT_EXIST')
|