예제 #1
0
    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
예제 #2
0
    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()
예제 #3
0
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")
예제 #4
0
        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)
예제 #5
0
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")
예제 #6
0
        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)
예제 #7
0
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")
예제 #8
0
 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))
예제 #9
0
 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)
예제 #10
0
 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)
예제 #11
0
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'))
예제 #12
0
 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)
예제 #13
0
    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)
예제 #14
0
    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))))
예제 #15
0
 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