106 lines
3.5 KiB
Python
106 lines
3.5 KiB
Python
from functools import wraps
|
|
|
|
from flask import abort, request
|
|
|
|
|
|
def check_api(original_function):
|
|
@wraps(original_function)
|
|
def wrapper_function(*args, **kwargs): #1
|
|
from framework import F
|
|
|
|
#logger.debug('CHECK API... {} '.format(original_function.__module__))
|
|
#logger.warning(request.url)
|
|
#logger.warning(request.form)
|
|
try:
|
|
if F.SystemModelSetting.get_bool('auth_use_apikey'):
|
|
if request.method == 'POST':
|
|
apikey = request.form['apikey']
|
|
else:
|
|
apikey = request.args.get('apikey')
|
|
#apikey = request.args.get('apikey')
|
|
if apikey is None or apikey != F.SystemModelSetting.get('auth_apikey'):
|
|
F.logger.warning('CHECK API : ABORT no match ({})'.format(apikey))
|
|
F.logger.warning(request.environ.get('HTTP_X_REAL_IP', request.remote_addr))
|
|
abort(403)
|
|
return
|
|
except Exception as e:
|
|
F.logger.warning('CHECK API : ABORT exception')
|
|
abort(403)
|
|
return
|
|
return original_function(*args, **kwargs) #2
|
|
return wrapper_function
|
|
|
|
# Suuport를 logger 생성전에 쓰지 않기 위해 중복 선언
|
|
import logging
|
|
|
|
|
|
class CustomFormatter(logging.Formatter):
|
|
"""Logging Formatter to add colors and count warning / errors"""
|
|
|
|
grey = "\x1b[38;21m"
|
|
yellow = "\x1b[33;21m"
|
|
red = "\x1b[31;21m"
|
|
bold_red = "\x1b[31;1m"
|
|
reset = "\x1b[0m"
|
|
green = "\x1B[32m"
|
|
# pathname filename
|
|
#format = "[%(asctime)s|%(name)s|%(levelname)s - %(message)s (%(filename)s:%(lineno)d)"
|
|
format = '[{yellow}%(asctime)s{reset}|{color}%(levelname)s{reset}|{green}%(name)s{reset}|%(pathname)s:%(lineno)s] {color}%(message)s{reset}'
|
|
|
|
FORMATS = {
|
|
logging.DEBUG: format.format(color=grey, reset=reset, yellow=yellow, green=green),
|
|
logging.INFO: format.format(color=green, reset=reset, yellow=yellow, green=green),
|
|
logging.WARNING: format.format(color=yellow, reset=reset, yellow=yellow, green=green),
|
|
logging.ERROR: format.format(color=red, reset=reset, yellow=yellow, green=green),
|
|
logging.CRITICAL: format.format(color=bold_red, reset=reset, yellow=yellow, green=green)
|
|
}
|
|
|
|
def format(self, record):
|
|
log_fmt = self.FORMATS.get(record.levelno)
|
|
formatter = logging.Formatter(log_fmt)
|
|
return formatter.format(record)
|
|
|
|
|
|
# Suuport를 logger 생성전에 쓰지 않기 위해 중복 선언
|
|
def read_yaml(filepath):
|
|
import yaml
|
|
with open(filepath, encoding='utf8') as file:
|
|
data = yaml.load(file, Loader=yaml.FullLoader)
|
|
return data
|
|
|
|
|
|
class User:
|
|
def __init__(self, user_id, email=None, passwd_hash=None, authenticated=False):
|
|
self.user_id = user_id
|
|
self.email = email
|
|
self.passwd_hash = passwd_hash
|
|
self.authenticated = authenticated
|
|
|
|
def __repr__(self):
|
|
r = {
|
|
'user_id': self.user_id,
|
|
'email': self.email,
|
|
'passwd_hash': self.passwd_hash,
|
|
'authenticated': self.authenticated,
|
|
}
|
|
return str(r)
|
|
|
|
def can_login(self, passwd_hash):
|
|
from support.base.aes import SupportAES
|
|
tmp = SupportAES.decrypt(self.passwd_hash)
|
|
return passwd_hash == tmp
|
|
|
|
def is_active(self):
|
|
return True
|
|
|
|
def get_id(self):
|
|
return self.user_id
|
|
|
|
def is_authenticated(self):
|
|
return self.authenticated
|
|
|
|
def is_anonymous(self):
|
|
return False
|
|
|
|
|