def check_passwd_for_cms(user_id, password): package_name = 'pkg_user_auth' if StrUtil.get_safe_config(current_app, 'PROJECT_STAGE') == Const.DEVELOPMENT: package_name = 'pkg_user_auth_debug' current_sqlalchemy_echo = StrUtil.get_safe_config( current_app, 'SQLALCHEMY_ECHO') # 認証SQLのログを出力しないようにする db.session.bind.echo = False returnVal = db.session.execute( 'select ' + package_name + '.check_passwd_for_cms(:user_id, :password) as val from dual', { 'user_id': user_id, 'password': password }).fetchone().val # 現状設定に戻す db.session.bind.echo = current_sqlalchemy_echo if returnVal == 0: return True return False
def get_db_adm_session_info(session_id): current_time = datetime.now() return CmsSessionTable.query.filter_by(cookie_name=StrUtil.get_safe_config(current_app, 'CMS_DB_SYS_COOKIE'), session_id=session_id) \ .filter(CmsSessionTable.login_date >= current_time - timedelta(days=7)) \ .filter(CmsSessionTable.login_date <= current_time).first()
def redirectDbAdmin(db_id): if len(db_id) == 0: flash('[db_id]パラメータを入れてください') return render_template('error/404.html') # データベースオブジェクトを取得する current_db = app.lib.cms_lib.session.get_current_db(db_id) # グローバル変数に設定する app.lib.cms_lib.session.current_db = current_db if current_db is None: flash('[db_id:{}]情報を取得できません'.format(db_id)) return render_template('error/404.html') StrUtil.print_debug("db_adm_login_required. cur_db.db_id=[{}]".format( str(current_db.db_id))) if current_user.is_active: session['last_login_user_id'] = current_user.get_id() return set_cookie( StrUtil.get_safe_config(current_app, 'CMS_DB_SYS_COOKIE'), current_user.tuid, url_for('db_adm_index', db_id=db_id)) form = LoginForm() # ログイン情報を保持する last_login_user_id = StrUtil.get_safe_edit_mode('last_login_user_id', session) user_id = request.args.get('user_id') or last_login_user_id if user_id: form.user_id.data = user_id return render_template('cms_admin/login.html', form=form, db_id=db_id, db_name=current_db.db_name, systemVersion="Developer Version 1.00")
def wrapper(*args, **kwargs): logout_user() StrUtil.print_debug('db_adm_login_required. func=[{}]'.format( func.__name__)) db_id = app.lib.cms_lib.session.get_db_id() if not db_id: flash('[db_id]パラメータが必要です') return redirect(url_for('login')) # データベースオブジェクトを取得する current_db = app.lib.cms_lib.session.get_current_db(db_id) # グローバル変数に設定する app.lib.cms_lib.session.current_db = current_db # db情報チェック if not current_db: flash('[db_id:{}]情報を取得できません'.format(db_id)) return redirect(url_for('db_adm_login', db_id=db_id)) StrUtil.print_debug( 'db_adm_login_required. cur_db.db_id=[{}]'.format( str(current_db.db_id))) session_id = app.lib.cms_lib.session.get_session_id( StrUtil.get_safe_config(current_app, 'CMS_DB_SYS_COOKIE')) if session_id: StrUtil.print_debug( 'db_adm_login_required. session_cookie_name:{0} session_id:{1}' .format('DB_ADMIN_SESSION_COOKIE', session_id)) cst = CmsSessionTable.get_db_adm_session_info(session_id) if cst is None: flash('invalid user_id or password') return redirect(url_for('db_adm_login')) # 取得したユーザIDでユーザ情報を取得する user = User.query.filter_by(tuid=cst.user_id).first() if user is None: flash('invalid user_id or password') return redirect(url_for('db_adm_login')) # DB管理者権限チェック pkgCmsSecurity = PkgCmsSecurity() if not pkgCmsSecurity.isDbAdminUser(db_id, user.tuid): flash('利用権限がありません') return redirect( UserAuth._get_redirect_url( url_for('db_adm_login', db_id=current_db.db_id))) login_user(user, False) else: StrUtil.print_debug('login_required. no session id got.') return redirect( UserAuth._get_redirect_url( url_for('db_adm_login', db_id=current_db.db_id))) return func(*args, **kwargs)
def doDbAdminLogin(db_id, form): if len(db_id) == 0: flash('[db_id]パラメータを入れてください') return render_template('error/404.html') # データベースオブジェクトを取得する current_db = app.lib.cms_lib.session.get_current_db(db_id) # グローバル変数に設定する app.lib.cms_lib.session.current_db = current_db if current_db is None: flash('[db_id:{}]情報を取得できません'.format(db_id)) return render_template('error/404.html') StrUtil.print_debug("db_adm_login_required. cur_db.db_id=[{}]".format( str(current_db.db_id))) # リダイレクトURLを取得する next_url = _get_next_url() if form.validate_on_submit(): user = User.query.filter_by(tuid=form.user_id.data).first() if user is None or not PkgUserAuth.check_passwd_for_cms( form.user_id.data, form.password.data): # エラーログを記録する pkgCmsErrLog = PkgCmsErrLog() pkgCmsErrLog.saveErrLog('LOGIN_ERROR', str(form.user_id.data), str(current_db.db_id), '') db.session.commit() flash('invalid user_id or password') return redirect( url_for('db_adm_login', db_id=db_id, user_id=form.user_id.data, next_url=next_url)) login_user(user, False) session['last_login_user_id'] = form.user_id.data return set_cookie( StrUtil.get_safe_config(current_app, 'CMS_DB_SYS_COOKIE'), current_user.tuid, url_for('db_adm_index', db_id=db_id)) # ログイン情報を保持する last_login_user_id = StrUtil.get_safe_edit_mode('last_login_user_id', session) user_id = request.args.get('user_id') or last_login_user_id if user_id: form.user_id.data = user_id return render_template('cms_db_admin/login.html', form=form, db_id=db_id, db_name=current_db.db_name, next_url=next_url, systemVersion="Developer Version 1.00")
def wrapper(*args, **kwargs): logout_user() StrUtil.print_debug('adm_login_required. func=[{}]'.format( str(func.__name__))) session_id = app.lib.cms_lib.session.get_session_id( StrUtil.get_safe_config(current_app, 'CMS_SYS_COOKIE')) if session_id: StrUtil.print_debug( 'login_required. session_cookie_name:{0} session_id:{1}'. format('ADMIN_SESSION_COOKIE', session_id)) cst = CmsSessionTable.get_adm_session_info(session_id) if cst is None: flash('invalid user_id or password') return redirect(url_for('adm_login')) # 取得したユーザIDでユーザ情報を取得する user = User.query.filter_by(tuid=cst.user_id).first() if user is None: flash('invalid user_id or password') return redirect(url_for('adm_login')) # 管理者権限チェック pkgCmsSecurity = PkgCmsSecurity() if not pkgCmsSecurity.isAdminUser(user.tuid): flash('利用権限がありません') return redirect( UserAuth._get_redirect_url(url_for('adm_login'))) login_user(user, False) else: StrUtil.print_debug('login_required. no session id got.') return redirect( UserAuth._get_redirect_url(url_for('adm_login'))) return func(*args, **kwargs)
def doAdminLogin(form): # リダイレクトURLを取得する next_url = _get_next_url() if form.validate_on_submit(): user = User.query.filter_by(tuid=form.user_id.data).first() if user is None or not PkgUserAuth.check_passwd_for_cms( form.user_id.data, form.password.data): # エラーログを記録する pkgCmsErrLog = PkgCmsErrLog() pkgCmsErrLog.saveErrLog('LOGIN_ERROR', str(form.user_id.data), '', '') db.session.commit() flash('invalid user_id or password') return redirect( url_for('adm_login', user_id=form.user_id.data, next_url=next_url)) login_user(user, False) session['last_login_user_id'] = form.user_id.data return set_cookie( StrUtil.get_safe_config(current_app, 'CMS_SYS_COOKIE'), current_user.tuid, url_for('adm_index')) # ログイン情報を保持する last_login_user_id = StrUtil.get_safe_edit_mode('last_login_user_id', session) user_id = request.args.get('user_id') or last_login_user_id if user_id: form.user_id.data = user_id return render_template('cms_admin/login.html', form=form, next_url=next_url, systemVersion="Developer Version 1.00")
def json_serial(obj): # 日付型の場合には、文字列に変換します if isinstance(obj, (datetime, date)): return obj.strftime(StrUtil.get_safe_config(current_app, 'STRFTIME_TIME_FORMAT')) raise TypeError("Type %s not serializable" % type(obj))
def save_and_get_filename(self): upload_temp_dir = StrUtil.get_safe_config(current_app, 'UPLOAD_TMP_DIR_PATH') if upload_temp_dir and not os.path.exists(upload_temp_dir): os.makedirs(upload_temp_dir, exist_ok=True) return self._save_file_temporarily(upload_temp_dir)
def get_template_filename(self): upload_temp_dir = StrUtil.get_safe_config(current_app, 'UPLOAD_TMP_DIR_PATH') return os.path.join(upload_temp_dir, self.template_id.data + Const.FILE_SUFFIX_EXCEL)
from app import create_app from app.lib.cms_lib.str_util import StrUtil app = create_app() if __name__ == '__main__': app.run(debug=StrUtil.get_safe_config(app, 'DEBUG'))
def _tmp_file_remove(app): # 解凍パスを取得する unzip_dir_path = str(StrUtil.get_safe_config(app, 'UNZIP_DIR_PATH_CTX')) if os.path.exists(unzip_dir_path): shutil.rmtree(unzip_dir_path)
def optimize_ctx(self, app): try: # データベースオブジェクトを取得する db_list = CmsDb.getCmsDbList() if db_list is None: return False row_num = str(StrUtil.get_safe_config(app, 'CTX_MAX_OBJECT_CNT')) for db_info in db_list: StrUtil.print_debug("optimize_ctx db_id=[{}] begin.".format( str(db_info.db_id))) cms_object = CmsObject() for object_info in cms_object.getCtxObjectList( db_info.db_id, row_num): cmsCtxData = CmsCtxData() # cms_ctx_dataからレコード削除 (updateされた場合の対応) cmsCtxData.delCmsCtxData(object_info.object_id, db_info.db_id) # タイトルテキスト 例:<#IDX_TEXT_001#> : <#IDX_TEXT_002#> ctx_title_rst = { 'CTX_TITLE': '', 'CTX_TEXT': '', 'CTX_ERROR_FLG': 0, 'CTX_ERROR_LOG': '' } cms_object.getCtxTitle(object_info.object_type_id, object_info.object_id, None, object_info.ctx_title_format, ctx_title_rst) # cms_ctx_dataに登録する情報を設定する cmsCtxData.db_id = db_info.db_id cmsCtxData.object_id = object_info.object_id cmsCtxData.object_updated_at = object_info.updated_at cmsCtxData.ctx_title = ctx_title_rst['CTX_TITLE'] cmsCtxData.ctx_text = ctx_title_rst['CTX_TEXT'] cmsCtxData.ctx_error_log = ctx_title_rst['CTX_ERROR_LOG'] cmsCtxData.data_type = Const.DATA_TYPE_OBJECT url = Const.URL_FORMAT.format( str(StrUtil.get_safe_config( app, 'CMS_SYS_URL')).strip('/') + '/property', 'func={}&db_id={}&id={}&object_id={}'.format( 'show_property', db_info.db_id, object_info.parent_folder_id, object_info.object_id)) cmsCtxData.ctx_url = url cmsCtxData.ctx_error_flg = ctx_title_rst['CTX_ERROR_FLG'] # cms_ctx_dataに登録する cmsCtxData.addCmsCtxData(cmsCtxData) # INDEXに登録したら、 cms_object.ctx_indexed_flg=1にする cms_object.ctxUpdObject(object_info.object_id, 1) # cms_object_property, cms_file_typeからINDEX対象の属性やファイルを特定 cms_file = CmsFile() for file_info in cms_file.get_ctx_file_list( object_info.object_id): if not ctx_allowed_file(file_info.file_name): continue cmsCtxData = CmsCtxData() # ctx_text = ctx_text_format.format(ctx_text, # file_info.file_name + ":" # + os.path.join(file_info.dir_name, # file_info.c_file_name)) StrUtil.print_debug( 'ctx_file file_info=[file_name={}; file_path={}]'. format( file_info.file_name, os.path.join(file_info.dir_name, file_info.c_file_name))) # CTX_TITLE_FOTMATの取得 cmsFileType = CmsFileType() fileTypeInfo = cmsFileType.getFileTypeInfo( file_info.file_type_id) # タイトルテキスト 例:<#IDX_TEXT_001#> : <#IDX_TEXT_002#> (<#FILE_NAME#>) ctx_title_rst = { 'CTX_TITLE': '', 'CTX_TEXT': '', 'CTX_ERROR_FLG': 0, 'CTX_ERROR_LOG': '' } cms_object.getCtxTitle(object_info.object_type_id, object_info.object_id, file_info.file_id, fileTypeInfo.ctx_title_format, ctx_title_rst) ctx_text_rst = { 'CTX_TEXT': '', 'CTX_ERROR_FLG·': 0, 'CTX_ERROR_LOG': '' } CtxUtil._get_ctx_text(app, file_info, ctx_text_rst) # URL url = '' # テキスト ctx_text = Const.CONTACT_FORMAT.format( ctx_title_rst['CTX_TEXT'], ctx_text_rst['CTX_TEXT']) # エラーメッセージ ctx_error_log = ctx_title_rst['CTX_ERROR_LOG'] if len(ctx_error_log) != 0: ctx_error_log += '\n' ctx_error_log += ctx_text_rst['CTX_ERROR_LOG'] # cms_ctx_dataに登録する情報を設定する cmsCtxData.db_id = db_info.db_id cmsCtxData.object_id = object_info.object_id cmsCtxData.object_updated_at = object_info.updated_at cmsCtxData.ctx_title = ctx_title_rst['CTX_TITLE'] cmsCtxData.ctx_text = ctx_text cmsCtxData.ctx_error_log = StrUtil.truncate( ctx_error_log, 4000) cmsCtxData.data_type = Const.DATA_TYPE_FILE if ctx_text_rst['CTX_ERROR_FLG'] == 0: url = Const.URL_FORMAT.format( str(StrUtil.get_safe_config( app, 'CMS_SYS_URL')).strip('/') + '/download_file', 'db_id={}&file_id={}'.format( db_info.db_id, file_info.file_id)) cmsCtxData.ctx_url = url cmsCtxData.ctx_error_flg = ctx_text_rst[ 'CTX_ERROR_FLG'] # cms_ctx_dataに登録する cmsCtxData.addCmsCtxData(cmsCtxData) cms_file = CmsFile(object_info.object_id) # INDEXに登録したら、 cms_file.ctx_indexed_flg=1にする cms_file.setCtxIndexedFlg(file_info.file_id, 1) # DBごと処理後にtmpフォルダを空にする CtxUtil._tmp_file_remove(app) StrUtil.print_debug('optimize_ctx db_id=[{}] end.'.format( str(db_info.db_id))) db.session.commit() except Exception as e: db.session.rollback() tb = sys.exc_info()[2] StrUtil.print_error('optimize_ctx error_msg:{}'.format( str(e.with_traceback(tb)))) CtxUtil._tmp_file_remove(app)
def _get_ctx_text(app, file_info, ctx_text_rst): file_path = os.path.join(file_info.dir_name, file_info.c_file_name) if not os.path.isfile(file_path): ctx_text_rst['CTX_TEXT'] = '' ctx_text_rst['CTX_ERROR_FLG'] = 1 ctx_text_rst['CTX_ERROR_LOG'] = Const.NO_FILE_FOUND_MSG.format( file_path) return # 解凍パスを取得する unzip_dir_path = str(StrUtil.get_safe_config(app, 'UNZIP_DIR_PATH_CTX')) # ファイルを解凍する tmp_file_name = Const.FILE_EXTENSION_FORMAT.format( file_info.file_id, file_info.file_name.rsplit('.', 1)[1].lower()) unzip_file_path = FileUtil.unzip_file(file_path, unzip_dir_path, tmp_file_name) # ファイル存在しないか解凍失敗の場合 if unzip_file_path is None: ctx_text_rst['CTX_TEXT'] = '' ctx_text_rst['CTX_ERROR_FLG'] = 1 ctx_text_rst['CTX_ERROR_LOG'] = Const.UNZIP_ERROR_MSG.format( unzip_file_path) return try: # 設定ファイルからJAVA_LIBを取得 java_lib = str(StrUtil.get_safe_config(app, 'JAVA_LIB')) # PDFファイルのテキスト抽出 cmd = '{java_bin} -jar {java_lib} -t {file_path}'.format( **{ 'java_bin': '/usr/java/jdk1.8.0_40/bin/java', 'java_lib': os.path.join(java_lib, 'tika-app-1.23.jar'), 'file_path': unzip_file_path, }) completed_process = subprocess.run(cmd.split(), stdout=subprocess.PIPE, stderr=subprocess.PIPE) # 子プロセスが異常終了の場合 if completed_process.returncode != 0: ctx_text_rst['CTX_TEXT'] = '' ctx_text_rst['CTX_ERROR_FLG'] = 1 ctx_text_rst[ 'CTX_ERROR_LOG'] = completed_process.stderr.decode('utf-8') return ctx_text_rst['CTX_TEXT'] = completed_process.stdout.decode('utf-8') ctx_text_rst['CTX_ERROR_FLG'] = 0 ctx_text_rst['CTX_ERROR_LOG'] = '' except Exception as e: tb = sys.exc_info()[2] StrUtil.print_error("subprocess.run info:{} error_msg:{}".format( 'file_name:{} file_path:{}/{}'.format(file_info.file_name, file_info.dir_name, file_info.c_file_name), str(e.with_traceback(tb)))) ctx_text_rst['CTX_TEXT'] = '' ctx_text_rst['CTX_ERROR_FLG'] = 1 ctx_text_rst['CTX_ERROR_LOG'] = Const.CONTACT_FORMAT.format( cmd, Const.CMD_ERROR_MSG.format(str(e.with_traceback(tb))))
def get_max_upload_file_size(): max_upload_file_size = StrUtil.get_safe_config( current_app, 'MAX_UPLOAD_FILE_SIZE_MB') if not max_upload_file_size or max_upload_file_size <= 0: max_upload_file_size = 40 return max_upload_file_size