pgadmin4/web/pgadmin/authenticate/internal.py
Akshay Joshi df2f3460f0 Fix the following SonarQube code smells:
1) Use the "RegExp.exec()" method instead.
2) Remove parameter form or provide default value.
3) Extract this nested ternary operation into an independent statement.
4) Replace this character class by the character itself.
5) Unnecessary use of conditional expression for default assignment.
6) Prefer using an optional chain expression instead, as it's more concise and easier to read.
2024-06-11 18:07:22 +05:30

115 lines
3.6 KiB
Python

##########################################################################
#
# pgAdmin 4 - PostgreSQL Tools
#
# Copyright (C) 2013 - 2024, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
"""Implements Internal Authentication"""
from flask import current_app, flash
from flask_security import login_user
from abc import abstractmethod, abstractproperty
from flask_babel import gettext
from .registry import AuthSourceRegistry
from pgadmin.model import User
from pgadmin.utils.validation_utils import validate_email
from pgadmin.utils.constants import INTERNAL
class BaseAuthentication(metaclass=AuthSourceRegistry):
DEFAULT_MSG = {
'USER_DOES_NOT_EXIST': gettext('Incorrect username or password.'),
'LOGIN_FAILED': gettext('Login failed'),
'EMAIL_NOT_PROVIDED': gettext('Email/Username not provided'),
'PASSWORD_NOT_PROVIDED': gettext('Password not provided'),
'INVALID_EMAIL': gettext('Email/Username is not valid')
}
LOGIN_VIEW = 'security.login'
LOGOUT_VIEW = 'security.logout'
@abstractmethod
def get_source_name(self):
pass
@abstractmethod
def get_friendly_name(self):
pass
@abstractmethod
def authenticate(self, form):
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, None
if password is None or password == '':
form.password.errors = list(form.password.errors)
form.password.errors.append(
self.messages('PASSWORD_NOT_PROVIDED'))
return False, None
return True, None
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')
current_app.logger.info(
"Internal user {0} logged in.".format(username))
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):
def get_source_name(self):
return INTERNAL
def get_friendly_name(self):
return gettext("internal")
def validate(self, form):
"""User validation"""
# validate the email id first
if not validate_email(form.data['email']):
return False, self.messages('INVALID_EMAIL')
# Flask security validation
submit = form.validate_on_submit()
return submit, None
def authenticate(self, form):
username = form.data['email']
if form.validate_on_submit():
user = getattr(form, 'user',
User.query.filter_by(username=username).first())
if user and user.is_authenticated:
return True, None
return False, self.messages('USER_DOES_NOT_EXIST')