def execute_delete_organization_user(task_id):
    pm_logger = common_utils.begin_logger(task_id, __name__,
                                          inspect.currentframe())
    # タスク情報を取得します。
    # タスク情報のステータスチェックを行います。
    target = organizationTask_logic.check_process_status(task_id)
    if target is None:
        pm_logger.error("組織タスク情報取得に失敗しました。: TaskID=%s", task_id)
        raise PmError()

    # タスク情報から処理対象(ユーザーID,組織ID)を取得します。
    target = target.split(CommonConst.COMMA)
    user_id = target[0]
    organization_id = target[1]

    # 削除処理
    # 組織別通知メール宛先テーブル(PM_OrgNotifyMailDestinations)に組織ID{organization_id}をキーとしてクエリを実行し、対象情報を取得する。
    try:
        org_notify_mail_destinations = pm_orgNotifyMailDestinations.query_key(
            task_id, organization_id, CommonConst.NOTIFY_CODE)
    except PmError as e:
        pm_logger.error("組織別通知メール宛先情報取得に失敗しました。: OrganizationID=%s",
                        organization_id)
        raise common_utils.write_log_pm_error(e, pm_logger)

    # キーに合致するレコードが存在しなかった場合
    if (not org_notify_mail_destinations):
        # 処理を正常終了する。
        return

    # 取得したレコードのDestinationsのListデータを編集する。
    destinations = jmespath.search(
        "[?UserID != '{0}']".format(user_id),
        org_notify_mail_destinations['Destinations'])

    # 編集後のDestinationsは、組織別通知メール宛先テーブル(PM_OrgNotifyMailDestinations)へ組織ID{organization_id}をキーとしてupdate_itemで更新する。(UpdatedAtも現在日時で更新する)
    try:
        if (len(destinations) == 0):
            # 編集後のDestinationsのListデータが0件になる場合、組織別通知メール宛先テーブル(PM_OrgNotifyMailDestinations)の該当レコードを削除する。
            pm_orgNotifyMailDestinations.delete(task_id, organization_id,
                                                CommonConst.NOTIFY_CODE)
        else:
            attribute = {'Destinations': {"Value": destinations}}
            pm_orgNotifyMailDestinations.update(task_id, organization_id,
                                                CommonConst.NOTIFY_CODE,
                                                attribute)
    except PmError as e:
        pm_logger.error("組織別通知メール宛先情報の更新に失敗しました。: OrganizationID=%s",
                        organization_id)
        raise common_utils.write_log_pm_error(e, pm_logger)
示例#2
0
    def test_batch_delete_organization_user_success_with_update(self):
        # update pm_orgNotifyMailDestinaltions
        attribute = {'Destinations': {"Value": destinations_update}}
        pm_orgNotifyMailDestinations.update(trace_id,
                                            organization_id.format(3),
                                            notify_code, attribute)

        # handler
        task_id_3 = task_id.format(str(3))
        event_mock = {
            'TaskId': task_id_3,
            'Message': {
                'MessageId': 'MessageId',
                'ReceiptHandle': 'ReceiptHandle'
            }
        }
        users.execute_delete_organization_user_handler(event_mock, {})

        # Get data in database
        awscoop_task = pm_organizationTasks.query_key(task_id_3)

        # Check data
        self.assertEqual(int(awscoop_task['TaskStatus']), Status.Done.value)
示例#3
0
def execute_change_email(apply_id):
    pm_logger = common_utils.begin_logger(apply_id, __name__,
                                          inspect.currentframe())

    # バリデーションチェックを行います
    if common_utils.is_null(apply_id):
        return common_utils.error_common(MsgConst.ERR_201,
                                         HTTPStatus.UNPROCESSABLE_ENTITY,
                                         pm_logger)

    # set default value
    caller_service_name = 'insightwatch'

    # S3から通知メール送信設定ファイルを取得します。
    try:
        config = FileUtils.read_yaml(apply_id, CommonConst.S3_SETTING_BUCKET,
                                     CommonConst.NOTIFY_CONFIG_CIS_RESULT_MAIL)
    except PmError as e:
        pm_logger.error(
            "メールアドレス変更通知メール送信設定ファイルの取得に失敗しました。:s3://%s/%s",
            common_utils.get_environ(CommonConst.S3_SETTING_BUCKET),
            CommonConst.NOTIFY_CONFIG_CIS_RESULT_MAIL)
        common_utils.error_exception(MsgConst.ERR_S3_702,
                                     HTTPStatus.INTERNAL_SERVER_ERROR, e,
                                     pm_logger, True)
        return common_utils.get_response_by_response_body(
            HTTPStatus.OK,
            CommonConst.DEFAULT_RESPONSE_ERROR_PAGE[caller_service_name],
            is_response_json=False,
            content_type=CommonConst.CONTENT_TYPE_TEXT_HTML)

    # set data response error page default
    response_error_page = config[CommonConst.KEY_RESPONSE_ERROR_PAGE.format(
        serviceName=caller_service_name)]

    # メールアドレス変更申請テーブルから申請レコードを取得します。
    try:
        email_change_apply_info = pm_emailChangeApply.query_key(
            apply_id, apply_id, None)
    except PmError:
        pm_logger.error("メールアドレス変更申請テーブルでレコード取得に失敗しました。変更申請ID: %s", apply_id)
        return common_utils.get_response_by_response_body(
            HTTPStatus.OK,
            response_error_page,
            is_response_json=False,
            content_type=CommonConst.CONTENT_TYPE_TEXT_HTML)

    if not email_change_apply_info:
        pm_logger.warning("メールアドレス変更申請テーブルでレコードが存在しませんでした。変更申請ID: %s",
                          apply_id)
        return common_utils.get_response_by_response_body(
            HTTPStatus.OK,
            response_error_page,
            is_response_json=False,
            content_type=CommonConst.CONTENT_TYPE_TEXT_HTML)

    user_name = email_change_apply_info['UserID']
    if common_utils.check_key('CallerServiceName', email_change_apply_info):
        caller_service_name = email_change_apply_info['CallerServiceName']

    # data response page
    response_error_page = config[CommonConst.KEY_RESPONSE_ERROR_PAGE.format(
        serviceName=caller_service_name)]
    response_execute_change_email = config[
        CommonConst.KEY_RESPONSE_EXECUTE_CHANGE_EMAIL.format(
            serviceName=caller_service_name)]

    # メールアドレス変更申請テーブルから取得した UserID でCognito に合致する該当するユーザー情報を取得します。
    try:
        user_info = aws_common.get_cognito_user_info_by_user_name(
            apply_id, user_name)
    except PmError:
        pm_logger.error("Cognitoから情報取得に失敗しました。")
        return common_utils.get_response_by_response_body(
            HTTPStatus.OK,
            response_error_page,
            is_response_json=False,
            content_type=CommonConst.CONTENT_TYPE_TEXT_HTML)

    if not user_info:
        pm_logger.warning("Cognitoにユーザーが存在しませんでした。ユーザーID: %s", user_name)
        return common_utils.get_response_by_response_body(
            HTTPStatus.OK,
            response_error_page,
            is_response_json=False,
            content_type=CommonConst.CONTENT_TYPE_TEXT_HTML)

    before_mail_address = email_change_apply_info['BeforeMailAddress']
    after_mail_address = email_change_apply_info['AfterMailAddress']

    # get cognito email
    cognito_email = jmespath.search("[?Name=='email'].Value | [0]",
                                    user_info['UserAttributes'])

    if before_mail_address != cognito_email:
        pm_logger.warning("変更前メールアドレスがCognitoのメールアドレスと合致しませんでした。")
        return common_utils.get_response_by_response_body(
            HTTPStatus.OK,
            response_error_page,
            is_response_json=False,
            content_type=CommonConst.CONTENT_TYPE_TEXT_HTML)

    # Cognitoのメールアドレスを変更する
    try:
        user_attributes = [{
            'Name': 'email',
            'Value': after_mail_address
        }, {
            'Name': 'email_verified',
            'Value': 'true'
        }]
        aws_common.update_cognito_user_attributes(apply_id, user_name,
                                                  user_attributes)
    except PmError:
        pm_logger.error("Cognitoの項目変更に失敗しました。")
        return common_utils.get_response_by_response_body(
            HTTPStatus.OK,
            response_error_page,
            is_response_json=False,
            content_type=CommonConst.CONTENT_TYPE_TEXT_HTML)

    # get list affiliations
    try:
        affiliations = pm_affiliation.query_userid_key(apply_id, user_name)
    except PmError:
        pm_logger.error("ユーザー所属テーブルでレコード取得に失敗しました。")
        return common_utils.get_response_by_response_body(
            HTTPStatus.OK,
            response_error_page,
            is_response_json=False,
            content_type=CommonConst.CONTENT_TYPE_TEXT_HTML)

    for affiliation in affiliations:
        try:
            org_notify_mail_destinations = pm_orgNotifyMailDestinations.query_key(
                apply_id, affiliation['OrganizationID'],
                CommonConst.NOTIFY_CODE, None)
        except PmError:
            pm_logger.error("組織別通知メール宛先テーブルでレコード取得に失敗しました。")
            return common_utils.get_response_by_response_body(
                HTTPStatus.OK,
                response_error_page,
                is_response_json=False,
                content_type=CommonConst.CONTENT_TYPE_TEXT_HTML)

        if org_notify_mail_destinations:
            destinations_update = []
            for destination in org_notify_mail_destinations['Destinations']:
                if destination['MailAddress'] == before_mail_address:
                    destination['MailAddress'] = after_mail_address
                    destinations_update.append(destination)

            # update pm_orgNotifyMailDestinations
            try:
                attribute = {'Destinations': {"Value": destinations_update}}
                pm_orgNotifyMailDestinations.update(
                    apply_id, org_notify_mail_destinations['OrganizationID'],
                    org_notify_mail_destinations['NotifyCode'], attribute)
            except PmError:
                pm_logger.error("組織別通知メール宛先テーブルでレコード更新に失敗しました。")
                return common_utils.get_response_by_response_body(
                    HTTPStatus.OK,
                    response_error_page,
                    is_response_json=False,
                    content_type=CommonConst.CONTENT_TYPE_TEXT_HTML)

        # update pm_affiliation
        try:
            attribute = {'MailAddress': {"Value": after_mail_address}}
            pm_affiliation.update_affiliation(apply_id, affiliation['UserID'],
                                              affiliation['OrganizationID'],
                                              attribute,
                                              affiliation['UpdatedAt'])
        except PmError:
            pm_logger.error("ユーザー所属テーブルでレコード更新に失敗しました。")
            return common_utils.get_response_by_response_body(
                HTTPStatus.OK,
                response_error_page,
                is_response_json=False,
                content_type=CommonConst.CONTENT_TYPE_TEXT_HTML)

    # メールアドレス変更申請テーブルで変更申請ID{applyid}をキーにして申請レコードを削除する。
    try:
        pm_emailChangeApply.delete(apply_id, apply_id)
    except PmError:
        pm_logger.error("メールアドレス変更申請テーブルでレコード削除に失敗しました。変更申請ID: %s", apply_id)
        return common_utils.get_response_by_response_body(
            HTTPStatus.OK,
            response_error_page,
            is_response_json=False,
            content_type=CommonConst.CONTENT_TYPE_TEXT_HTML)

    # data response
    response = common_utils.get_response_by_response_body(
        HTTPStatus.OK,
        response_execute_change_email,
        is_response_json=False,
        content_type=CommonConst.CONTENT_TYPE_TEXT_HTML)
    return common_utils.response(response, pm_logger)
def send_result_email(trace_id, check_history_id, language):
    pm_logger = common_utils.begin_logger(trace_id, __name__,
                                          inspect.currentframe())
    # チェック結果テーブルのCheckHistoryIndexから、チェック履歴ID{CheckHistoryId}をキーとしてチェック結果一覧を取得します。
    try:
        list_check_result = pm_checkResults.query_history_index(
            trace_id, check_history_id)
    except PmError as e:
        msg_err = "チェック結果の取得に失敗しました。"
        pm_logger.error(msg_err)
        raise common_utils.write_log_pm_error(e, pm_logger, msg_err)

    if (not list_check_result):
        msg_err = "チェック結果の取得に失敗しました。"
        pm_logger.error(msg_err)
        raise PmError(message=msg_err)

    # チェック結果一覧のうちの一つから、組織IDを取得します。
    organization_id = list_check_result[0]['OrganizationID']
    organization_name = list_check_result[0]['OrganizationName']
    project_name = list_check_result[0]['ProjectName']

    # 宛先ユーザーの確認をします。ユーザー所属テーブルのOrganizationIndexから、組織IDをキー
    try:
        users = pm_affiliation.query_users_organization_index(
            trace_id, organization_id, InvitationStatus.Belong)
    except PmError as e:
        msg_err = "ユーザー所属情報の取得に失敗しました。:OrganizationID={0}".format(
            organization_id)
        pm_logger.error(msg_err)
        raise common_utils.write_log_pm_error(e, pm_logger, msg_err)

    # 組織別通知メール宛先テーブルから、組織ID、通知コードCHECK_CISをキーとして宛先情報を取得します。
    try:
        org_notify_mail_destinations = pm_orgNotifyMailDestinations.query_key(
            trace_id, organization_id, CommonConst.NOTIFY_CODE)
    except PmError as e:
        msg_err = "宛先情報の取得に失敗しました。:OrganizationID={0}, CheckCode={1}".format(
            organization_id, CommonConst.NOTIFY_CODE)
        pm_logger.error(msg_err)
        raise common_utils.write_log_pm_error(e, pm_logger, msg_err)

    if (not org_notify_mail_destinations):
        msg_err = "宛先情報の取得に失敗しました。:OrganizationID={0}, CheckCode={1}".format(
            organization_id, CommonConst.NOTIFY_CODE)
        pm_logger.error(msg_err)
        raise PmError(message=msg_err)

    destinations = []
    for destination in org_notify_mail_destinations['Destinations']:
        for user in users:
            if destination['UserID'] == user['UserID']:
                destinations.append(destination)
                break
    try:
        if (len(destinations) == 0):
            pm_orgNotifyMailDestinations.delete(trace_id, organization_id,
                                                CommonConst.NOTIFY_CODE)
        else:
            attribute = {'Destinations': {"Value": destinations}}
            pm_orgNotifyMailDestinations.update(trace_id, organization_id,
                                                CommonConst.NOTIFY_CODE,
                                                attribute)
    except PmError as e:
        msg_err = "通知メール宛先ユーザーの更新に失敗しました。:OrganizationID={0}, CheckCode={1}".format(
            organization_id, CommonConst.NOTIFY_CODE)
        pm_logger.error(msg_err)
        raise common_utils.write_log_pm_error(e, pm_logger, msg_err)

    # S3から通知メール送信設定ファイルを取得します。
    try:
        config = FileUtils.read_yaml(trace_id, CommonConst.S3_SETTING_BUCKET,
                                     CommonConst.NOTIFY_CONFIG_CIS_RESULT_MAIL)
    except PmError as e:
        msg_err = "通知メール送信設定ファイルの取得に失敗しました。:s3://{0}/{1}".format(
            common_utils.get_environ(CommonConst.S3_SETTING_BUCKET),
            CommonConst.NOTIFY_CONFIG_CIS_RESULT_MAIL)
        pm_logger.error(msg_err)
        raise common_utils.write_log_pm_error(e, pm_logger, msg_err)

    language_mail = CommonConst.LANGUAGE_DEFAULT
    if language in CommonConst.LANGUAGE_SUPPORT:
        language_mail = language

    path_file_template = config[CommonConst.KEY_GET_PATH_FILE_TEMPLATE_MAIL.
                                format(language=language_mail)]
    mail_subject_config = config[CommonConst.KEY_MAIL_SUBJECT.format(
        language=language_mail)]

    # 通知メール本文を作成
    try:
        template_body = FileUtils.read_decode(trace_id,
                                              CommonConst.S3_SETTING_BUCKET,
                                              path_file_template)
    except PmError as e:
        msg_err = "知メール本文テンプレートファイルの取得に失敗しました。:s3://{0}/{1}".format(
            common_utils.get_environ(CommonConst.S3_SETTING_BUCKET),
            path_file_template)
        pm_logger.error(msg_err)
        raise common_utils.write_log_pm_error(e, pm_logger, msg_err)

    # 通知メール件名を作成
    subject_template = Template(mail_subject_config)
    mail_subject = subject_template.render(project_name=project_name)

    # メール本文
    executed_date_time = date_utils.toString(
        date_utils.toDate(list_check_result[0]['ExecutedDateTime'],
                          date_utils.UTC), date_utils.PATTERN_YYYYMMDDHHMM,
        date_utils.ASIA_TOKYO)

    executed_date_time_utc = date_utils.toString(
        date_utils.toDate(list_check_result[0]['ExecutedDateTime'],
                          date_utils.UTC), date_utils.PATTERN_YYYYMMDDHHMM,
        date_utils.UTC)

    check_results = []
    for check_result in list_check_result:
        account_aws = CommonConst.AWS_ACCOUNT_MAIL.format(
            check_result['AWSAccount'][:4], check_result['AWSAccount'][4:8])
        check_result = {
            "accountAWS": account_aws,
            "okCount": check_result['OKCount'],
            "ngCount": check_result['NGCount'],
            "criticalCount": check_result['CriticalCount'],
            "managedCount": check_result['ManagedCount'],
            "errorCount": check_result['ErrorCount']
        }
        check_results.append(check_result)

    template = Template(template_body)
    context = {
        'organizationName': organization_name,
        'projectName': project_name,
        'executedDateTime': executed_date_time,
        'executedDateTimeUTC': executed_date_time_utc,
        'checkResults': check_results
    }
    body = template.render(context)

    # SESで通知メールを送信します。
    list_bcc_addresses = []
    bcc_addresses = []
    for index, destination in enumerate(destinations):
        bcc_addresses.append(destination['MailAddress'])
        if (len(bcc_addresses) >= 50 or len(destinations) == index + 1):
            list_bcc_addresses.append(bcc_addresses)
            bcc_addresses = []

    for index, bcc_addresses in enumerate(list_bcc_addresses):
        try:
            aws_common.send_email(trace_id, config['ses.region'],
                                  config['mail.from'], bcc_addresses,
                                  mail_subject, body)
        except PmError as e:
            msg_err = "通知メール送信に失敗しました。({0}/{1})".format(
                index + 1, len(list_bcc_addresses))
            pm_logger.error(msg_err)
            raise common_utils.write_log_pm_error(e, pm_logger, msg_err)