
Pylint is currently running python3.0 syntax and we are updating the pylint to python3.9. As a result we received a few warnings that have not been previously identified with python3.0 syntax. This code change will address those warnings raised by latest pylint check. The following alarms are addressed: 1. W0237 - Parameter '.' has been renamed to '.' in overridden method 2. E1101 - Instance of '.' has no '.' member (no-member) 3. W0127 - Assigning the same variable to itself 4. E4702 - Iterated dict is being modified inside for loop body 5. W0602 - Using global for '.' but no assignment is done 6. E1123 - Unexpected keyword argument '.'. in method call 7. W0238 - Unused private memeber '.' 8. E1121 - Too many positional arguments for methods call The following alarms are still remain suppressed: 1. W1514 - Using open with specifying encoding (python2 does not support this change) 2. W0707 - Consider explicitly re-raising using raise '.' from '.' (same as above) Test Plan : 1. Perform DC Regression Test and compare before and after code change 2. Ensure Tox can pass on both Debain and CentOS build server 3. Ensure pylint3 and pylint3.9 can pass without warning 4. Ensure ISO can be properly booted on both Debian and CentOS Story: 2008943 Task: 45832 Signed-off-by: BoYuan Chang <boyuan.chang@windriver.com> Change-Id: I6f3a25fd788a3bdc021067c624123132a716e5c8
148 lines
5.1 KiB
Python
148 lines
5.1 KiB
Python
# Licensed 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.
|
|
#
|
|
# Copyright (c) 2019, 2022 Wind River Systems, Inc.
|
|
#
|
|
# SPDX-License-Identifier: Apache-2.0
|
|
#
|
|
|
|
import pecan
|
|
from pecan import hooks
|
|
|
|
from oslo_context import context as base_context
|
|
from oslo_utils import encodeutils
|
|
|
|
from dcdbsync.common import policy
|
|
from dcdbsync.db.identity import api as db_api
|
|
|
|
ALLOWED_WITHOUT_AUTH = '/'
|
|
|
|
|
|
class RequestContext(base_context.RequestContext):
|
|
"""Stores information about the security context.
|
|
|
|
The context encapsulates information related to the user accessing the
|
|
the system, as well as additional request information.
|
|
"""
|
|
|
|
def __init__(self, auth_token=None, user=None, project=None,
|
|
domain=None, user_domain=None, project_domain=None,
|
|
is_admin=None, read_only=False, show_deleted=False,
|
|
request_id=None, auth_url=None, trusts=None,
|
|
user_name=None, project_name=None, domain_name=None,
|
|
user_domain_name=None, project_domain_name=None,
|
|
auth_token_info=None, region_name=None, roles=None,
|
|
password=None, **kwargs):
|
|
|
|
# Initializer of request context.
|
|
# We still have 'tenant' param because oslo_context still use it.
|
|
# pylint: disable=E1123
|
|
super(RequestContext, self).__init__(
|
|
auth_token=auth_token, user=user, tenant=project,
|
|
domain=domain, user_domain=user_domain,
|
|
project_domain=project_domain, roles=roles,
|
|
read_only=read_only, show_deleted=show_deleted,
|
|
request_id=request_id)
|
|
|
|
# request_id might be a byte array
|
|
self.request_id = encodeutils.safe_decode(self.request_id)
|
|
|
|
# we save an additional 'project' internally for use
|
|
self.project = project
|
|
|
|
# Session for DB access
|
|
self._session = None
|
|
|
|
self.auth_url = auth_url
|
|
self.trusts = trusts
|
|
|
|
self.user_name = user_name
|
|
self.project_name = project_name
|
|
self.domain_name = domain_name
|
|
self.user_domain_name = user_domain_name
|
|
self.project_domain_name = project_domain_name
|
|
|
|
self.auth_token_info = auth_token_info
|
|
self.region_name = region_name
|
|
self.roles = roles or []
|
|
self.password = password
|
|
|
|
# Check user is admin or not
|
|
if is_admin is None:
|
|
self.is_admin = policy.enforce(self, 'context_is_admin',
|
|
target={'project': self.project},
|
|
do_raise=False)
|
|
else:
|
|
self.is_admin = is_admin
|
|
|
|
@property
|
|
def session(self):
|
|
if self._session is None:
|
|
self._session = db_api.get_session()
|
|
return self._session
|
|
|
|
def to_dict(self):
|
|
return {
|
|
'auth_url': self.auth_url,
|
|
'auth_token': self.auth_token,
|
|
'auth_token_info': self.auth_token_info,
|
|
'user': self.user,
|
|
'user_name': self.user_name,
|
|
'user_domain': self.user_domain,
|
|
'user_domain_name': self.user_domain_name,
|
|
'project': self.project,
|
|
'project_name': self.project_name,
|
|
'project_domain': self.project_domain,
|
|
'project_domain_name': self.project_domain_name,
|
|
'domain': self.domain,
|
|
'domain_name': self.domain_name,
|
|
'trusts': self.trusts,
|
|
'region_name': self.region_name,
|
|
'roles': self.roles,
|
|
'show_deleted': self.show_deleted,
|
|
'is_admin': self.is_admin,
|
|
'request_id': self.request_id,
|
|
'password': self.password,
|
|
}
|
|
|
|
@classmethod
|
|
def from_dict(cls, values):
|
|
return cls(**values)
|
|
|
|
|
|
def get_admin_context(show_deleted=False):
|
|
return RequestContext(is_admin=True, show_deleted=show_deleted)
|
|
|
|
|
|
def get_service_context(**args):
|
|
"""An abstraction layer for getting service context."""
|
|
|
|
pass
|
|
|
|
|
|
class AuthHook(hooks.PecanHook):
|
|
def before(self, state):
|
|
if state.request.path == ALLOWED_WITHOUT_AUTH:
|
|
return
|
|
req = state.request
|
|
identity_status = req.headers.get('X-Identity-Status')
|
|
service_identity_status = req.headers.get('X-Service-Identity-Status')
|
|
if (identity_status == 'Confirmed' or
|
|
service_identity_status == 'Confirmed'):
|
|
return
|
|
if req.headers.get('X-Auth-Token'):
|
|
msg = 'Auth token is invalid: %s' % req.headers['X-Auth-Token']
|
|
else:
|
|
msg = 'Authentication required'
|
|
msg = "Failed to validate access token: %s" % str(msg)
|
|
pecan.abort(status_code=401, detail=msg)
|