Ejemplo n.º 1
0
def delete_user(trace_id, organization_id, user_id, email):
    pm_logger = common_utils.begin_logger(trace_id, __name__,
                                          inspect.currentframe())
    # check the deletion condition
    if user_id == trace_id:
        try:
            count = pm_affiliation.query_users_check_authority_count(
                trace_id, user_id, organization_id, Authority.Owner)
        except PmError as e:
            return common_utils.error_exception(
                MsgConst.ERR_402, HTTPStatus.INTERNAL_SERVER_ERROR, e,
                pm_logger, True)
        if count == 0:
            return common_utils.error_common(MsgConst.ERR_REQUEST_203,
                                             HTTPStatus.PRECONDITION_FAILED,
                                             pm_logger)
    # get user to delete
    try:
        user = pm_affiliation.query(user_id, organization_id)
    except PmError as e:
        return common_utils.error_exception(MsgConst.ERR_402,
                                            HTTPStatus.INTERNAL_SERVER_ERROR,
                                            e, pm_logger, True)
    if not user:
        return common_utils.error_common(MsgConst.ERR_301,
                                         HTTPStatus.NOT_FOUND, pm_logger)

    # delete user
    try:
        pm_affiliation.delete_affiliation(user_id, organization_id)
    except PmError as e:
        return common_utils.error_exception(MsgConst.ERR_DB_405,
                                            HTTPStatus.INTERNAL_SERVER_ERROR,
                                            e, pm_logger, True)

    # set task informaiton request delete in Organization Tasks
    task_id = str(uuid.uuid4())
    target = CommonConst.TARGET_DELETE_ORG_USER.format(user_id,
                                                       organization_id)

    try:
        # create task informaiton request delete in Organization Tasks
        pm_organizationTasks.create_organizationTask(
            trace_id, task_id, CommonConst.TASK_TYPE_CODE_DELETE_ORG_USER,
            target, trace_id, email, Status.Waiting.value, 0, 3)
    except PmError as e:
        return common_utils.error_exception(MsgConst.ERR_DB_403,
                                            HTTPStatus.INTERNAL_SERVER_ERROR,
                                            e, pm_logger, True)
    try:
        # Send message to organization topic task
        aws_common.sns_organization_topic(
            trace_id, task_id, CommonConst.TASK_TYPE_CODE_DELETE_ORG_USER)
    except PmError as e:
        common_utils.write_log_pm_error(e, pm_logger, exc_info=True)

    response = common_utils.get_response_by_response_body(
        HTTPStatus.NO_CONTENT, None)
    return common_utils.response(response, pm_logger)
Ejemplo n.º 2
0
def update_security_check_webhook(trace_id, webhook_path, user_id, data_body):
    pm_logger = common_utils.begin_logger(trace_id, __name__,
                                          inspect.currentframe())

    has_webhook_path = 'webhookPath' in data_body
    has_enabled = 'enabled' in data_body

    webhook = None
    try:
        webhooks = pm_securityCheckWebhook.query_webhook_index(
            trace_id, webhook_path)
        if webhooks:
            webhook = webhooks[0]
    except PmError as e:
        return common_utils.error_exception(MsgConst.ERR_402,
                                            HTTPStatus.INTERNAL_SERVER_ERROR,
                                            e, pm_logger, True)

    if not webhook:
        return common_utils.error_common(MsgConst.ERR_301,
                                         HTTPStatus.NOT_FOUND, pm_logger)

    if webhook['UserID'] != user_id:
        return common_utils.error_common(MsgConst.ERR_301,
                                         HTTPStatus.NOT_FOUND, pm_logger)

    if has_webhook_path:
        attribute = {'WebhookPath': {"Value": common_utils.get_uuid4()}}
    elif has_enabled:
        attribute = {'Enabled': {"Value": data_body['enabled']}}
    else:
        return common_utils.error_common(MsgConst.ERR_REQUEST_201,
                                         HTTPStatus.BAD_REQUEST, pm_logger)

    updated_at = webhook['UpdatedAt']
    try:
        pm_securityCheckWebhook.update(
            trace_id, webhook['SecurityCheckWebhookID'], attribute, updated_at)
        webhook = pm_securityCheckWebhook.query_key(
            trace_id, webhook['SecurityCheckWebhookID'], convert_response=True)
    except PmError as e:
        return common_utils.error_exception(MsgConst.ERR_DB_404,
                                            HTTPStatus.INTERNAL_SERVER_ERROR,
                                            e, pm_logger, True)

    response = common_utils.get_response_by_response_body(
        HTTPStatus.OK, webhook)
    return common_utils.response(response, pm_logger)
Ejemplo n.º 3
0
def delete_awscoop(trace_id, coop_id, organization_id, project_id):
    pm_logger = common_utils.begin_logger(trace_id, __name__,
                                          inspect.currentframe())
    try:
        awscoops = pm_awsAccountCoops.get_awscoops_update(
            trace_id, coop_id, project_id, organization_id)
    except PmError as err:
        return common_utils.error_exception(MsgConst.ERR_402,
                                            HTTPStatus.INTERNAL_SERVER_ERROR,
                                            err, pm_logger, True)

    if awscoops is None:
        return common_utils.error_common(MsgConst.ERR_301,
                                         HTTPStatus.NOT_FOUND, pm_logger)

    try:
        pm_awsAccountCoops.delete_awscoops(trace_id, coop_id)
    except PmError as err:
        return common_utils.error_exception(MsgConst.ERR_DB_405,
                                            HTTPStatus.INTERNAL_SERVER_ERROR,
                                            err, pm_logger, True)

    # response if delete success
    response = common_utils.get_response_by_response_body(
        HTTPStatus.NO_CONTENT, None)
    return common_utils.response(response, pm_logger)
Ejemplo n.º 4
0
def get_report(trace_id, report_id, organization_id, project_id):
    pm_logger = common_utils.begin_logger(trace_id, __name__,
                                          inspect.currentframe())

    try:
        report = pm_reports.query_report_filter_organization_project(
            trace_id,
            report_id,
            project_id,
            organization_id,
            convert_response=True)
    except PmError as e:
        return common_utils.error_exception(MsgConst.ERR_402,
                                            HTTPStatus.INTERNAL_SERVER_ERROR,
                                            e, pm_logger, True)

    # 組織情報を取得します。
    if (not report):
        return common_utils.error_common(MsgConst.ERR_301,
                                         HTTPStatus.NOT_FOUND, pm_logger)

    # response when do success
    response = common_utils.get_response_by_response_body(
        HTTPStatus.OK, report[0])
    return common_utils.response(response, pm_logger)
Ejemplo n.º 5
0
def delete_notifymail(trace_id, organization_id, notify_code):
    pm_logger = common_utils.begin_logger(trace_id, __name__,
                                          inspect.currentframe())
    # 全てのチェックを行い、エラーがあった場合はログを出力してエラーレスポンスを返します。
    list_error = validate_notifymail(notify_code)
    if list_error:
        return common_utils.error_validate(MsgConst.ERR_REQUEST_201,
                                           HTTPStatus.UNPROCESSABLE_ENTITY,
                                           list_error, pm_logger)
    try:
        result = pm_orgNotifyMailDestinations.query_key(
            trace_id, organization_id, notify_code)
    except PmError as e:
        return common_utils.error_exception(MsgConst.ERR_402,
                                            HTTPStatus.INTERNAL_SERVER_ERROR,
                                            e, pm_logger, True)
    if (not result):
        return common_utils.error_common(MsgConst.ERR_301,
                                         HTTPStatus.NOT_FOUND, pm_logger)
    try:
        pm_orgNotifyMailDestinations.delete(trace_id, organization_id,
                                            notify_code)
    except PmError as e:
        return common_utils.error_exception(MsgConst.ERR_DB_404,
                                            HTTPStatus.INTERNAL_SERVER_ERROR,
                                            e, pm_logger, True)

    # return response data
    response = common_utils.get_response_by_response_body(
        HTTPStatus.NO_CONTENT, None)
    return common_utils.response(response, pm_logger)
def delete_assessment_item(trace_id, organization_id, project_id,
                           check_item_code, coop_id):
    pm_logger = common_utils.begin_logger(trace_id, __name__,
                                          inspect.currentframe())

    # リソース関連性のバリデーションチェックを行います。
    try:
        awscoop_item = pm_awsAccountCoops.query_awscoop_coop_key(
            trace_id, coop_id)
    except Exception as e:
        return common_utils.error_exception(MsgConst.ERR_402,
                                            HTTPStatus.INTERNAL_SERVER_ERROR,
                                            e, pm_logger, True)
    if not awscoop_item:
        return common_utils.error_common(MsgConst.ERR_AWS_401,
                                         HTTPStatus.UNPROCESSABLE_ENTITY,
                                         pm_logger)

    # マニュアル評価情報を取得します。
    assessment_item_id = CommonConst.ASSESSMENTITEM_ID.format(
        organization_id, project_id, awscoop_item['AWSAccount'],
        check_item_code)
    try:
        assessment_item = pm_assessmentItems.query_key(trace_id,
                                                       assessment_item_id)
    except Exception as e:
        return common_utils.error_exception(MsgConst.ERR_402,
                                            HTTPStatus.INTERNAL_SERVER_ERROR,
                                            e, pm_logger, True)

    if not assessment_item:
        return common_utils.error_common(MsgConst.ERR_301,
                                         HTTPStatus.NOT_FOUND, pm_logger)

    # マニュアル評価情報を削除します。
    try:
        pm_assessmentItems.delete(trace_id, assessment_item_id)
    except Exception as e:
        return common_utils.error_exception(MsgConst.ERR_DB_405,
                                            HTTPStatus.INTERNAL_SERVER_ERROR,
                                            e, pm_logger, True)

    # return response data
    response = common_utils.get_response_by_response_body(
        HTTPStatus.NO_CONTENT, None)
    return common_utils.response(response, pm_logger)
Ejemplo n.º 7
0
def update_organization(trace_id, organization_id, data_body):
    pm_logger = common_utils.begin_logger(trace_id, __name__,
                                          inspect.currentframe())

    # Parse JSON
    try:
        body_object = json.loads(data_body)
        organization_name = body_object["name"]
    except Exception as e:
        return common_utils.error_exception(MsgConst.ERR_REQUEST_202,
                                            HTTPStatus.BAD_REQUEST, e,
                                            pm_logger, True)

    # Validate
    list_error = validate_update(organization_name)
    if list_error:
        return common_utils.error_validate(MsgConst.ERR_REQUEST_201,
                                           HTTPStatus.UNPROCESSABLE_ENTITY,
                                           list_error, pm_logger)

    # Databaseから組織情報を取得する
    try:
        organization_item = pm_organizations.get_organization(
            trace_id, organization_id)
    except PmError as e:
        return common_utils.error_exception(MsgConst.ERR_402,
                                            HTTPStatus.INTERNAL_SERVER_ERROR,
                                            e, pm_logger, True)

    if (not organization_item):
        return common_utils.error_common(MsgConst.ERR_301,
                                         HTTPStatus.NOT_FOUND, pm_logger)

    # Update Organization
    attribute = {'OrganizationName': {"Value": organization_name}}
    updated_at = organization_item['UpdatedAt']
    try:
        pm_organizations.update_organization(trace_id, organization_id,
                                             attribute, updated_at)
    except PmError as e:
        return common_utils.error_exception(MsgConst.ERR_DB_404,
                                            HTTPStatus.INTERNAL_SERVER_ERROR,
                                            e, pm_logger, True)

    # Get data update
    try:
        organization_result = pm_organizations.get_organization(
            trace_id, organization_id, True)
    except PmError as e:
        return common_utils.error_exception(MsgConst.ERR_402,
                                            HTTPStatus.INTERNAL_SERVER_ERROR,
                                            e, pm_logger, True)

    response = common_utils.get_response_by_response_body(
        HTTPStatus.OK, organization_result)

    # return data response
    return common_utils.response(response, pm_logger)
Ejemplo n.º 8
0
def request_output_report(trace_id, email, organization_id, project_id,
                          report_id, file_type):
    pm_logger = common_utils.begin_logger(trace_id, __name__,
                                          inspect.currentframe())

    # Validate
    list_error = validate_output_report(trace_id, file_type)
    if list_error:
        return common_utils.error_validate(MsgConst.ERR_REQUEST_201,
                                           HTTPStatus.UNPROCESSABLE_ENTITY,
                                           list_error, pm_logger)

    # レポートテーブルから、レポート情報を取得します。
    try:
        # get report
        report = pm_reports.query_report_filter_organization_project(
            trace_id, report_id, project_id, organization_id,
            ReportStatus.ConvertFinish.value)
    except PmError as e:
        return common_utils.error_exception(MsgConst.ERR_402,
                                            HTTPStatus.INTERNAL_SERVER_ERROR,
                                            e, pm_logger, True)

    if (not report):
        return common_utils.error_common(MsgConst.ERR_301,
                                         HTTPStatus.NOT_FOUND, pm_logger)

    # 指定のファイル形式のレポートがすでに作成済みか確認します。
    if (report[0]['ExcelOutputStatus'] != ExcelStatus.Waiting.value):
        return common_utils.error_common(MsgConst.ERR_302, HTTPStatus.CONFLICT,
                                         pm_logger)

    # レポート出力ジョブの設定
    job_id = []
    code = 'OUTPUT_REPORT_EXCEL'
    response, job_id = job_report(trace_id, email, report_id, code, job_id)
    if response:
        return common_utils.response(response, pm_logger)

    # 取得したジョブIDをレスポンス(ステータスコード:201)として返します。
    response = common_utils.get_response_by_response_body(
        HTTPStatus.CREATED, job_id[0])
    return common_utils.response(response, pm_logger)
Ejemplo n.º 9
0
def generate_security_check_webhook(trace_id, organization_id, project_id,
                                    user_id, email):
    pm_logger = common_utils.begin_logger(trace_id, __name__,
                                          inspect.currentframe())

    # リソース関連性のバリデーションチェックを行います。
    try:
        project = pm_projects.get_projects_by_organization_id(
            trace_id, project_id, organization_id)
    except PmError as e:
        return common_utils.error_exception(MsgConst.ERR_402,
                                            HTTPStatus.INTERNAL_SERVER_ERROR,
                                            e, pm_logger, True)
    if not project:
        return common_utils.error_common(
            MsgConst.ERR_AWS_401, HTTPStatus.UNPROCESSABLE_ENTITY, pm_logger)

    try:
        webhooks = pm_securityCheckWebhook.query_project_index(
            trace_id, project_id, user_id)
    except PmError as e:
        return common_utils.error_exception(MsgConst.ERR_402,
                                            HTTPStatus.INTERNAL_SERVER_ERROR,
                                            e, pm_logger, True)
    if webhooks:
        return common_utils.error_common(MsgConst.ERR_302, HTTPStatus.CONFLICT,
                                         pm_logger)

    try:
        security_check_webhook_id = common_utils.get_uuid4()
        webhook_path = common_utils.get_uuid4()
        pm_securityCheckWebhook.create(trace_id, security_check_webhook_id,
                                       webhook_path, user_id, email,
                                       organization_id, project_id, 3)
    except PmError as e:
        return common_utils.error_exception(MsgConst.ERR_DB_403,
                                            HTTPStatus.INTERNAL_SERVER_ERROR,
                                            e, pm_logger, True)

    response = common_utils.get_response_by_response_body(
        HTTPStatus.CREATED, {'webhookPath': webhook_path})
    return common_utils.response(response, pm_logger)
Ejemplo n.º 10
0
def get_report_url(trace_id, report_id, organization_id, project_id,
                   file_type):
    pm_logger = common_utils.begin_logger(trace_id, __name__,
                                          inspect.currentframe())

    # Validate
    list_error = validate_output_report(trace_id, file_type)
    if list_error:
        return common_utils.error_validate(MsgConst.ERR_REQUEST_201,
                                           HTTPStatus.UNPROCESSABLE_ENTITY,
                                           list_error, pm_logger)

    try:
        report = pm_reports.query_report_filter_organization_project(
            trace_id, report_id, project_id, organization_id,
            ReportStatus.ConvertFinish)
    except PmError as e:
        return common_utils.error_exception(MsgConst.ERR_402,
                                            HTTPStatus.INTERNAL_SERVER_ERROR,
                                            e, pm_logger, True)

    if not report:
        return common_utils.error_common(MsgConst.ERR_301,
                                         HTTPStatus.NOT_FOUND, pm_logger)

    if report[0]["ExcelOutputStatus"] != ExcelStatus.Finish:
        return common_utils.error_common(MsgConst.ERR_301,
                                         HTTPStatus.NOT_FOUND, pm_logger)

    try:
        excel_path = report[0]["ExcelPath"]
        bucket = os.environ.get("S3_REPORT_BUCKET")
        url = aws_common.generate_presigned_url(trace_id, bucket, excel_path)
    except PmError as e:
        return common_utils.error_exception(MsgConst.ERR_999,
                                            HTTPStatus.INTERNAL_SERVER_ERROR,
                                            e, pm_logger, True)

    response_body = {"URL": url}
    response = common_utils.get_response_by_response_body(
        HTTPStatus.OK, response_body)
    return common_utils.response(response, pm_logger)
Ejemplo n.º 11
0
def execute_security_check_with_executed_type(trace_id, organization_id,
                                              project_id, user_id, email,
                                              executed_type):
    pm_logger = common_utils.begin_logger(trace_id, __name__,
                                          inspect.currentframe())

    # リソース関連性のバリデーションチェックを行います。
    try:
        project = pm_projects.get_projects_by_organization_id(
            trace_id, project_id, organization_id)
    except PmError as e:
        return common_utils.error_exception(MsgConst.ERR_402,
                                            HTTPStatus.INTERNAL_SERVER_ERROR,
                                            e, pm_logger, True)
    if not project:
        return common_utils.error_common(
            MsgConst.ERR_AWS_401, HTTPStatus.UNPROCESSABLE_ENTITY, pm_logger)

    try:
        check_history_id = common_utils.get_uuid4()
        executed_date_time = common_utils.get_current_date()
        pm_checkHistory.create(trace_id, check_history_id, organization_id,
                               project_id, CHECK_SECURITY, CheckStatus.Waiting,
                               None, executed_type, None, executed_date_time,
                               None, user_id)
    except PmError as e:
        return common_utils.error_exception(MsgConst.ERR_DB_403,
                                            HTTPStatus.INTERNAL_SERVER_ERROR,
                                            e, pm_logger, True)

    try:
        topic_arn = common_utils.get_environ(
            CommonConst.SECURITYCHECK_EXECUTE_TOPIC)
        subject = "USER : {0}".format(user_id)
        message = {
            'CheckHistoryId': check_history_id
        }
        # Publish message
        aws_common.aws_sns(trace_id, subject, json.dumps(message), topic_arn)
    except PmError as e:
        common_utils.write_log_pm_error(e, pm_logger, exc_info=True)

    try:
        check_history = pm_checkHistory.query_key(trace_id, check_history_id,
                                                  True)
    except PmError as e:
        return common_utils.error_exception(MsgConst.ERR_402,
                                            HTTPStatus.INTERNAL_SERVER_ERROR,
                                            e, pm_logger, True)
    # return data response
    response = common_utils.get_response_by_response_body(
        HTTPStatus.CREATED, check_history)
    return common_utils.response(response, pm_logger)
Ejemplo n.º 12
0
def reject_invite(trace_id, organization_id, user_id, user_id_sign_in):
    pm_logger = common_utils.begin_logger(trace_id, __name__,
                                          inspect.currentframe())

    # check user sign in and parameter user id
    if user_id_sign_in != user_id:
        return common_utils.error_common(MsgConst.ERR_101,
                                         HTTPStatus.FORBIDDEN, pm_logger)
    response = change_invite(trace_id, organization_id, user_id,
                             InvitationStatus.Deny)

    # return data response
    return common_utils.response(response, pm_logger)
Ejemplo n.º 13
0
def get_security_check_webhook_by_ids(trace_id, user_id, organization_id,
                                      project_id):
    pm_logger = common_utils.begin_logger(trace_id, __name__,
                                          inspect.currentframe())

    webhook = None
    # リソース関連性のバリデーションチェックを行います。
    try:
        project = pm_projects.get_projects_by_organization_id(
            trace_id, project_id, organization_id)
    except PmError as e:
        return common_utils.error_exception(MsgConst.ERR_402,
                                            HTTPStatus.INTERNAL_SERVER_ERROR,
                                            e, pm_logger, True)
    if not project:
        return common_utils.error_common(
            MsgConst.ERR_AWS_401, HTTPStatus.UNPROCESSABLE_ENTITY, pm_logger)

    try:
        webhooks = pm_securityCheckWebhook.query_project_index(
            trace_id, project_id, user_id)
        if webhooks:
            webhook = pm_securityCheckWebhook.query_key(
                trace_id,
                webhooks[0]['SecurityCheckWebhookID'],
                convert_response=True)
    except PmError as e:
        return common_utils.error_exception(MsgConst.ERR_402,
                                            HTTPStatus.INTERNAL_SERVER_ERROR,
                                            e, pm_logger, True)

    if not webhook:
        return common_utils.error_common(MsgConst.ERR_301,
                                         HTTPStatus.NOT_FOUND, pm_logger)

    response = common_utils.get_response_by_response_body(
        HTTPStatus.OK, webhook)
    return response
Ejemplo n.º 14
0
def create_awscoops(trace_id, project_id, organization_id):
    pm_logger = common_utils.begin_logger(trace_id, __name__,
                                          inspect.currentframe())
    try:
        project = pm_projects.get_projects_by_organization_id(
            trace_id, project_id, organization_id)
    except PmError as e:
        return common_utils.error_exception(MsgConst.ERR_402,
                                            HTTPStatus.INTERNAL_SERVER_ERROR,
                                            e, pm_logger, True)

    # 組織情報を取得します。
    if (not project):
        return common_utils.error_common(MsgConst.ERR_AWS_401,
                                         HTTPStatus.UNPROCESSABLE_ENTITY,
                                         pm_logger)

    # Create AWSアカウント連携
    coop_id = str(uuid.uuid4())
    aws_account = CommonConst.UNKNOWN
    aws_account_name = None
    role_name = None
    external_id = str(uuid.uuid4())
    description = None
    effective = Effective.UnConfirmed.value

    try:
        pm_awsAccountCoops.create_awscoops(trace_id, coop_id, aws_account,
                                           aws_account_name, role_name,
                                           external_id, description, effective,
                                           organization_id, project_id)
    except PmError as e:
        return common_utils.error_exception(MsgConst.ERR_DB_403,
                                            HTTPStatus.INTERNAL_SERVER_ERROR,
                                            e, pm_logger, True)

    # Get data response
    try:
        awscoops_item = pm_awsAccountCoops.query_awscoop_coop_key(
            trace_id, coop_id, convert_response=True)
    except PmError as e:
        return common_utils.error_exception(MsgConst.ERR_402,
                                            HTTPStatus.INTERNAL_SERVER_ERROR,
                                            e, pm_logger, True)

    # return data response
    response = common_utils.get_response_by_response_body(
        HTTPStatus.CREATED, awscoops_item)
    return common_utils.response(response, pm_logger)
Ejemplo n.º 15
0
def authority(trace_id, user_id, organization_id, authority):
    pm_logger = common_utils.begin_logger(trace_id, __name__,
                                          inspect.currentframe())
    response = None
    try:
        is_access_ok = check_authority(trace_id, user_id, organization_id,
                                       authority)
        if (not is_access_ok):
            return common_utils.error_common(MsgConst.ERR_101,
                                             HTTPStatus.FORBIDDEN, pm_logger)
    except PmError as e:
        return common_utils.error_exception(MsgConst.ERR_402,
                                            HTTPStatus.INTERNAL_SERVER_ERROR,
                                            e, pm_logger)
    return common_utils.response(response, pm_logger)
Ejemplo n.º 16
0
def delete_project(trace_id, email, project_id, organization_id):
    # Get logging
    pm_logger = common_utils.begin_logger(trace_id, __name__,
                                          inspect.currentframe())
    try:
        project = pm_projects.get_projects_by_organization_id(
            trace_id, project_id, organization_id, convert_response=True)
    except PmError as e:
        return common_utils.error_exception(MsgConst.ERR_402,
                                            HTTPStatus.INTERNAL_SERVER_ERROR,
                                            e, pm_logger, True)

    # 組織情報を取得します。
    if (not project):
        return common_utils.error_common(MsgConst.ERR_301,
                                         HTTPStatus.NOT_FOUND, pm_logger)

    # プロジェクト削除の条件を満たしているかチェックを行います。現時点ではチェックすべき項目はありません。
    # 現時点ではチェックすべき項目はありません。

    # Delete project
    try:
        pm_projects.delete_projects(trace_id, project_id)
    except PmError as e:
        return common_utils.error_exception(MsgConst.ERR_DB_405,
                                            HTTPStatus.INTERNAL_SERVER_ERROR,
                                            e, pm_logger, True)

    # Create task
    task_id = str(uuid.uuid4())
    user_id = trace_id
    try:
        pm_organizationTasks.create_organizationTask(trace_id, task_id,
                                                     "DELETE_PRJ", project_id,
                                                     user_id, email,
                                                     Status.Waiting.value, 0,
                                                     3)
    except PmError as e:
        return common_utils.error_exception(MsgConst.ERR_DB_403,
                                            HTTPStatus.INTERNAL_SERVER_ERROR,
                                            e, pm_logger, True)

    aws_common.sns_organization_topic(trace_id, task_id, "DELETE_PRJ")

    # data response
    response = common_utils.get_response_by_response_body(
        HTTPStatus.NO_CONTENT, None)
    return common_utils.response(response, pm_logger)
Ejemplo n.º 17
0
def get_security_check_report_url(trace_id, user_id, history_id):
    pm_logger = common_utils.begin_logger(trace_id, __name__,
                                          inspect.currentframe())

    # チェック履歴情報を取得します。
    try:
        check_history = pm_checkHistory.get_check_history_by_status(
            trace_id, history_id, CheckStatus.ReportCompleted)
    except PmError as e:
        return common_utils.error_exception(MsgConst.ERR_402,
                                            HTTPStatus.INTERNAL_SERVER_ERROR,
                                            e, pm_logger, True)

    # 該当するレコードが存在しない場合(取得件数が0件)
    if len(check_history) == 0:
        return common_utils.error_common(MsgConst.ERR_301,
                                         HTTPStatus.NOT_FOUND, pm_logger)

    # 取得したチェック履歴情報より組織IDを取得する
    organization_id = check_history[0]['OrganizationID']

    # アクセス権限チェックを行います
    response_authority = checkauthority.authority(
        trace_id, user_id, organization_id, Authority.Viewer)
    if response_authority:
        return common_utils.response(response_authority, pm_logger)

    # 有効期限が作成から1時間となる署名付きURLを作成します。
    try:
        signed_url = aws_common.generate_presigned_url(
            trace_id, common_utils.get_environ('S3_CHECK_BUCKET'),
            check_history[0]['ReportFilePath'])
    except PmError as e:
        return common_utils.error_exception(MsgConst.ERR_999,
                                            HTTPStatus.INTERNAL_SERVER_ERROR,
                                            e, pm_logger, True)

    # return data response
    response_body = {"URL": signed_url}
    response = common_utils.get_response_by_response_body(
        HTTPStatus.OK, response_body)
    return common_utils.response(response, pm_logger)
Ejemplo n.º 18
0
def delete_report(trace_id, email, report_id, organization_id, project_id):
    pm_logger = common_utils.begin_logger(trace_id, __name__,
                                          inspect.currentframe())
    try:
        # get report
        report_item = pm_reports.query_report_filter_organization_project(
            trace_id, report_id, project_id, organization_id)
    except PmError as e:
        return common_utils.error_exception(MsgConst.ERR_402,
                                            HTTPStatus.INTERNAL_SERVER_ERROR,
                                            e, pm_logger, True)

    if (not report_item):
        return common_utils.error_common(MsgConst.ERR_301,
                                         HTTPStatus.NOT_FOUND, pm_logger)

    try:
        # delete report
        pm_reports.delete_reports(trace_id, report_id)
    except PmError as e:
        return common_utils.error_exception(MsgConst.ERR_DB_405,
                                            HTTPStatus.INTERNAL_SERVER_ERROR,
                                            e, pm_logger, True)

    task_id = common_utils.get_uuid4()
    try:
        # create task informaiton request delete in Organization Tasks
        pm_organizationTasks.create_organizationTask(trace_id, task_id,
                                                     task_code, report_id,
                                                     trace_id, email, 0, 0, 3)
    except PmError as e:
        return common_utils.error_exception(MsgConst.ERR_DB_403,
                                            HTTPStatus.INTERNAL_SERVER_ERROR,
                                            e, pm_logger, True)

    # Send message to organization topic task
    aws_common.sns_organization_topic(trace_id, task_id, task_code)

    # response if delete success
    response = common_utils.get_response_by_response_body(
        HTTPStatus.NO_CONTENT, None)
    return common_utils.response(response, pm_logger)
Ejemplo n.º 19
0
def change_invite(trace_id, organization_id, user_id, invite):
    pm_logger = common_utils.begin_logger(trace_id, __name__,
                                          inspect.currentframe())

    # get affiliation
    try:
        affiliation = pm_affiliation.query_affiliation_filter_invite(
            trace_id, user_id, organization_id, InvitationStatus.Invited)
    except PmError as e:
        return common_utils.error_exception(MsgConst.ERR_402,
                                            HTTPStatus.INTERNAL_SERVER_ERROR,
                                            e, pm_logger, True)

    if not affiliation:
        return common_utils.error_common(MsgConst.ERR_301,
                                         HTTPStatus.NOT_FOUND, pm_logger)

    # update invite
    attribute = {'InvitationStatus': {"Value": invite}}
    updated_at = affiliation[0]['UpdatedAt']
    try:
        pm_affiliation.update_affiliation(trace_id, user_id, organization_id,
                                          attribute, updated_at)
    except PmError as err:
        return common_utils.error_exception(MsgConst.ERR_DB_404,
                                            HTTPStatus.INTERNAL_SERVER_ERROR,
                                            err, pm_logger, True)

    # Get data update
    try:
        affiliation_result = pm_affiliation.get_affiliation(
            user_id, organization_id, True)
    except PmError as e:
        return common_utils.error_exception(MsgConst.ERR_402,
                                            HTTPStatus.INTERNAL_SERVER_ERROR,
                                            e, pm_logger, True)

    response = common_utils.get_response_by_response_body(
        HTTPStatus.CREATED, affiliation_result)

    # return data response
    return common_utils.response(response, pm_logger)
Ejemplo n.º 20
0
def get_organization(trace_id, organization_id):
    pm_logger = common_utils.begin_logger(trace_id, __name__,
                                          inspect.currentframe())

    try:
        organization = pm_organizations.get_organization(
            trace_id, organization_id, True)
    except PmError as e:
        return common_utils.error_exception(MsgConst.ERR_402,
                                            HTTPStatus.INTERNAL_SERVER_ERROR,
                                            e, pm_logger, True)

    # 組織情報を取得します。
    if (not organization):
        return common_utils.error_common(MsgConst.ERR_301,
                                         HTTPStatus.NOT_FOUND, pm_logger)

    # data response
    response = common_utils.get_response_by_response_body(
        HTTPStatus.OK, organization)
    return common_utils.response(response, pm_logger)
def get_assessment_item(trace_id, organization_id, project_id, coop_id,
                        check_item_code):
    pm_logger = common_utils.begin_logger(trace_id, __name__,
                                          inspect.currentframe())
    # AWSアカウントAWSAccountは、AWSアカウント連携テーブルに、AWSアカウント連携ID{coop_id}をキーとしてクエリを実行します。
    try:
        awscoops_item = pm_awsAccountCoops.query_awscoop_coop_key(
            trace_id, coop_id)
    except Exception as e:
        return common_utils.error_exception(MsgConst.ERR_402,
                                            HTTPStatus.INTERNAL_SERVER_ERROR,
                                            e, pm_logger, True)

    # 有効なAWSアカウントが存在しなかった場合(取得件数が0件)
    if (not awscoops_item):
        return common_utils.error_common(MsgConst.ERR_AWS_401,
                                         HTTPStatus.UNPROCESSABLE_ENTITY,
                                         pm_logger)

    # マニュアル評価情報を取得します。
    assessment_item_id = CommonConst.ASSESSMENTITEM_ID.format(
        organization_id, project_id, awscoops_item['AWSAccount'],
        check_item_code)
    try:
        assessment_item = pm_assessmentItems.query_key(trace_id,
                                                       assessment_item_id,
                                                       True)
    except Exception as e:
        return common_utils.error_exception(MsgConst.ERR_402,
                                            HTTPStatus.INTERNAL_SERVER_ERROR,
                                            e, pm_logger, True)

    # 該当レコードが存在しなかった場合(取得件数が0件)
    if (not assessment_item):
        assessment_item = []

    # 取得したチェック項目除外情報をレスポンス(ステータスコード:200)として返します。
    response = common_utils.get_response_by_response_body(
        HTTPStatus.OK, assessment_item)
    return common_utils.response(response, pm_logger)
def get_excluesion_item(trace_id, organization_id, project_id, check_item_code,
                        coop_id):
    pm_logger = common_utils.begin_logger(trace_id, __name__,
                                          inspect.currentframe())

    # リソース関連性のバリデーションチェックを行います。
    try:
        awscoop_item = pm_awsAccountCoops.query_awscoop_coop_key(
            trace_id, coop_id)
    except Exception as err:
        return common_utils.error_exception(MsgConst.ERR_402,
                                            HTTPStatus.INTERNAL_SERVER_ERROR,
                                            err, pm_logger, True)

    if not awscoop_item:
        return common_utils.error_common(MsgConst.ERR_AWS_401,
                                         HTTPStatus.UNPROCESSABLE_ENTITY,
                                         pm_logger)

    # チェック項目除外情報を取得します。
    exclusion_item_id = CommonConst.EXCLUSIONITEM_ID.format(
        organization_id, project_id, awscoop_item['AWSAccount'],
        check_item_code)

    try:
        exclusion_item = pm_exclusionitems.query_key(trace_id,
                                                     exclusion_item_id, True)
    except Exception as err:
        return common_utils.error_exception(MsgConst.ERR_402,
                                            HTTPStatus.INTERNAL_SERVER_ERROR,
                                            err, pm_logger, True)

    if not exclusion_item:
        exclusion_item = []

    # return response data
    response = common_utils.get_response_by_response_body(
        HTTPStatus.OK, exclusion_item)
    return common_utils.response(response, pm_logger)
def get_excluded_resources(trace_id, project_id, organization_id, coop_id,
                           check_item_code):
    pm_logger = common_utils.begin_logger(trace_id, __name__,
                                          inspect.currentframe())

    # リソース関連性のバリデーションチェックを行います。
    try:
        awscoop_item = pm_awsAccountCoops.query_awscoop_coop_key(
            trace_id, coop_id)
    except Exception as e:
        return common_utils.error_exception(MsgConst.ERR_402,
                                            HTTPStatus.INTERNAL_SERVER_ERROR,
                                            e, pm_logger, True)

    if not awscoop_item:
        return common_utils.error_common(MsgConst.ERR_AWS_401,
                                         HTTPStatus.UNPROCESSABLE_ENTITY,
                                         pm_logger)

    check_item_refine_code = CommonConst.CHECK_ITEM_REFINE_CODE.format(
        organization_id, project_id, awscoop_item['AWSAccount'],
        check_item_code)

    # リソース除外設定情報を取得します。
    try:
        excluded_resources = pm_exclusionResources.query_check_item_refine_code(
            trace_id, check_item_refine_code, None, True)
    except Exception as e:
        return common_utils.error_exception(MsgConst.ERR_402,
                                            HTTPStatus.INTERNAL_SERVER_ERROR,
                                            e, pm_logger, True)

    # return response data
    response = common_utils.get_response_by_response_body(
        HTTPStatus.OK, excluded_resources)
    return common_utils.response(response, pm_logger)
Ejemplo n.º 24
0
def get_awscoop(trace_id, coop_id, project_id, organization_id):
    pm_logger = common_utils.begin_logger(trace_id, __name__,
                                          inspect.currentframe())
    try:
        awscoop = pm_awsAccountCoops.query_awscoop_filter_organization_project(
            trace_id,
            coop_id,
            organization_id,
            project_id,
            convert_response=True)
    except PmError as e:
        return common_utils.error_exception(MsgConst.ERR_402,
                                            HTTPStatus.INTERNAL_SERVER_ERROR,
                                            e, pm_logger, True)

    # 組織情報を取得します。
    if (not awscoop):
        return common_utils.error_common(MsgConst.ERR_301,
                                         HTTPStatus.NOT_FOUND, pm_logger)

    # data response
    response = common_utils.get_response_by_response_body(
        HTTPStatus.OK, awscoop[0])
    return common_utils.response(response, pm_logger)
Ejemplo n.º 25
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)
Ejemplo n.º 26
0
def apply_change_email(user_id, mail_before_change, data_body):
    pm_logger = common_utils.begin_logger(user_id, __name__,
                                          inspect.currentframe())
    # Parse JSON
    try:
        body_object = json.loads(data_body)
    except Exception as e:
        return common_utils.error_exception(MsgConst.ERR_REQUEST_202,
                                            HTTPStatus.BAD_REQUEST, e,
                                            pm_logger, True)

    mail_after_change = common_utils.get_value("mailAddress", body_object,
                                               None)
    caller_service_name = common_utils.get_value("callerServiceName",
                                                 body_object, None)

    mail_lang = common_utils.get_value("mailLang", body_object, None)

    # validate
    list_errors = validate_param_apply_change_email(user_id, mail_lang,
                                                    caller_service_name,
                                                    mail_before_change)
    if list_errors:
        return common_utils.error_validate(MsgConst.ERR_REQUEST_201,
                                           HTTPStatus.UNPROCESSABLE_ENTITY,
                                           list_errors, pm_logger)

    # Cognito UserPoolsから変更するメールアドレス{mailaddress}に該当するユーザー情報情報を取得します。
    try:
        list_users = aws_common.get_cognito_user_pools(user_id,
                                                       mail_after_change,
                                                       "email")
    except PmError as e:
        return common_utils.error_exception(MsgConst.ERR_COGNITO_501,
                                            HTTPStatus.INTERNAL_SERVER_ERROR,
                                            e, pm_logger, True)
    if list_users:
        return common_utils.error_common(MsgConst.ERR_302, HTTPStatus.CONFLICT,
                                         pm_logger)

    # メールアドレス変更申請テーブルから申請レコードを取得します。
    try:
        list_email_change_apply = pm_emailChangeApply.query_user_index(user_id)
    except PmError as e:
        return common_utils.error_exception(MsgConst.ERR_402,
                                            HTTPStatus.INTERNAL_SERVER_ERROR,
                                            e, pm_logger, True)
    if list_email_change_apply:
        return common_utils.error_common(MsgConst.ERR_302, HTTPStatus.CONFLICT,
                                         pm_logger)

    # メールアドレス変更申請テーブルに申請レコードを作成します。
    apply_id = common_utils.get_uuid4()
    time_to_live = common_utils.get_time_to_live(
        CommonConst.EMAIL_CHANGE_APPLY_EXPIRATION_DATE)
    try:
        pm_emailChangeApply.create(user_id, apply_id, mail_before_change,
                                   mail_after_change, time_to_live,
                                   caller_service_name)
    except PmError as e:
        return common_utils.error_exception(MsgConst.ERR_DB_403,
                                            HTTPStatus.INTERNAL_SERVER_ERROR,
                                            e, pm_logger, True)

    # get record PM_EmailChangeApply
    try:
        result = pm_emailChangeApply.query_key(user_id,
                                               apply_id,
                                               convert_response=True)
    except PmError as e:
        return common_utils.error_exception(MsgConst.ERR_402,
                                            HTTPStatus.INTERNAL_SERVER_ERROR,
                                            e, pm_logger, True)

    # S3から通知メール送信設定ファイルを取得します。
    try:
        config = FileUtils.read_yaml(user_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)
        return common_utils.error_exception(MsgConst.ERR_S3_702,
                                            HTTPStatus.INTERNAL_SERVER_ERROR,
                                            e, pm_logger, True)

    path_file_template = config[
        CommonConst.KEY_GET_PATH_FILE_TEMPLATE_MAIL_SERVICE.format(
            language=mail_lang, serviceName=caller_service_name)]
    # 通知メール本文を作成
    try:
        template_body_mail = FileUtils.read_decode(
            user_id, CommonConst.S3_SETTING_BUCKET, path_file_template)
    except PmError as e:
        pm_logger.error(
            "メールアドレス変更通知メール本文テンプレートファイルの取得に失敗しました。:s3://%s/%s",
            common_utils.get_environ(CommonConst.S3_SETTING_BUCKET),
            path_file_template)
        return common_utils.error_exception(MsgConst.ERR_S3_702,
                                            HTTPStatus.INTERNAL_SERVER_ERROR,
                                            e, pm_logger, True)

    # SESで通知メールを送信します。
    bcc_addresses = [mail_after_change]
    template_body_mail = Template(template_body_mail)
    body_mail = template_body_mail.render(ApplyID=apply_id)
    mail_subject = config[CommonConst.KEY_MAIL_SUBJECT_SERVICE.format(
        language=mail_lang, serviceName=caller_service_name)]
    mail_form = config[CommonConst.KEY_MAIL_FROM_SERVICE.format(
        serviceName=caller_service_name)]

    try:
        aws_common.send_email(user_id, config['ses.region'], mail_form,
                              bcc_addresses, mail_subject, body_mail)
    except PmError as e:
        pm_logger.error("通知メール送信に失敗しました。")
        return common_utils.error_exception(MsgConst.ERR_SES_801,
                                            HTTPStatus.INTERNAL_SERVER_ERROR,
                                            e, pm_logger, True)

    # return data response
    response = common_utils.get_response_by_response_body(
        HTTPStatus.CREATED, result)
    return common_utils.response(response, pm_logger)
Ejemplo n.º 27
0
def update_project(trace_id, project_id, organization_id, data_body):
    # Get logging
    pm_logger = common_utils.begin_logger(trace_id, __name__,
                                          inspect.currentframe())

    # Parse JSON
    try:
        body_object = json.loads(data_body)
        project_name = body_object["name"]
        description = body_object["description"]
    except Exception as e:
        return common_utils.error_exception(MsgConst.ERR_REQUEST_202,
                                            HTTPStatus.BAD_REQUEST, e,
                                            pm_logger, True)

    # Validate
    list_error = validate_project(trace_id, project_name)
    if list_error:
        return common_utils.error_validate(MsgConst.ERR_REQUEST_201,
                                           HTTPStatus.UNPROCESSABLE_ENTITY,
                                           list_error, pm_logger)
    # Get project
    try:
        project_item = pm_projects.get_projects_by_organization_id(
            trace_id, project_id, organization_id)
    except PmError as err:
        return common_utils.error_exception(MsgConst.ERR_402,
                                            HTTPStatus.INTERNAL_SERVER_ERROR,
                                            err, pm_logger, True)
    if not project_item:
        return common_utils.error_common(MsgConst.ERR_301,
                                         HTTPStatus.NOT_FOUND, pm_logger)

    # update project
    if common_utils.is_null(description):
        description = None
    attribute = {
        'ProjectName': {
            "Value": project_name
        },
        'Description': {
            "Value": description
        }
    }
    updated_at = project_item[0]['UpdatedAt']
    try:
        pm_projects.update_project(trace_id, project_id, attribute, updated_at)
    except PmError as err:
        return common_utils.error_exception(MsgConst.ERR_DB_404,
                                            HTTPStatus.INTERNAL_SERVER_ERROR,
                                            err, pm_logger, True)

    # Get data update
    try:
        project_result = pm_projects.get_projects(trace_id,
                                                  project_id,
                                                  convert_response=True)
    except PmError as err:
        return common_utils.error_exception(MsgConst.ERR_402,
                                            HTTPStatus.INTERNAL_SERVER_ERROR,
                                            err, pm_logger, True)

    response = common_utils.get_response_by_response_body(
        HTTPStatus.OK, project_result[0])

    # return data response
    return common_utils.response(response, pm_logger)
Ejemplo n.º 28
0
def create_report(trace_id, email, organization_id, project_id, data_body):
    pm_logger = common_utils.begin_logger(trace_id, __name__,
                                          inspect.currentframe())
    try:
        project = pm_projects.get_projects_by_organization_id(
            trace_id, project_id, organization_id)
    except PmError as e:
        return common_utils.error_exception(MsgConst.ERR_402,
                                            HTTPStatus.INTERNAL_SERVER_ERROR,
                                            e, pm_logger, True)

    # 組織情報を取得します。
    if (not project):
        return common_utils.error_common(MsgConst.ERR_AWS_401,
                                         HTTPStatus.UNPROCESSABLE_ENTITY,
                                         pm_logger)

    # Parse JSON
    try:
        body_object = json.loads(data_body)
        report_name = body_object["name"]
        aws_accounts = body_object["awsAccounts"]
        output_file_type = body_object["outputFileType"]
    except Exception as e:
        return common_utils.error_exception(MsgConst.ERR_REQUEST_202,
                                            HTTPStatus.BAD_REQUEST, e,
                                            pm_logger, True)

    # Validate
    list_error = validate_report(trace_id, report_name, aws_accounts,
                                 output_file_type)
    if list_error:
        return common_utils.error_validate(MsgConst.ERR_REQUEST_201,
                                           HTTPStatus.UNPROCESSABLE_ENTITY,
                                           list_error, pm_logger)

    # Create report
    report_id = common_utils.get_uuid4()
    status = Status.Waiting.value
    html_output_status = Status.Waiting.value
    excel_output_status = Status.Waiting.value
    schema_version = CommonConst.SCHEMA_VERSION
    try:
        pm_reports.create_report(trace_id, report_id, report_name, email,
                                 aws_accounts, status, None, None, None,
                                 html_output_status, None, None,
                                 excel_output_status, None, None,
                                 schema_version, organization_id, project_id)
    except PmError as e:
        return common_utils.error_exception(MsgConst.ERR_DB_403,
                                            HTTPStatus.INTERNAL_SERVER_ERROR,
                                            e, pm_logger, True)

    # AWS利用状況情報収集ジョブの設定
    # レポート中間ファイル作成ジョブの設定
    # レポート出力ジョブの設定
    codes = [
        'COLLECT_AWS_RESOURCE_INFO', 'OUTPUT_REPORT_JSON',
        'OUTPUT_REPORT_EXCEL'
    ]
    job_id = []
    for code in codes:
        response, job_id = job_report(trace_id, email, report_id, code, job_id)
        if response:
            # Delete report
            pm_reports.delete_reports(trace_id, report_id)
            return response

    try:
        report = pm_reports.query_report(trace_id, report_id, True)
    except PmError as e:
        return common_utils.error_exception(MsgConst.ERR_402,
                                            HTTPStatus.INTERNAL_SERVER_ERROR,
                                            e, pm_logger, True)
    # return data response
    response = common_utils.get_response_by_response_body(
        HTTPStatus.CREATED, report)
    return common_utils.response(response, pm_logger)
Ejemplo n.º 29
0
def job_report(trace_id, email, report_id, code, job_id):
    pm_logger = common_utils.begin_logger(trace_id, __name__,
                                          inspect.currentframe())
    try:
        report_job_def = pm_batchJobDefs.query_report_job_def_key(
            trace_id, code)
    except PmError as e:
        return common_utils.error_exception(MsgConst.ERR_402,
                                            HTTPStatus.INTERNAL_SERVER_ERROR,
                                            e, pm_logger, True), None

    if not report_job_def:
        pm_logger.error("ジョブ定義情報が取得できませんでした。:" + code)
        return common_utils.error_common(MsgConst.ERR_402,
                                         HTTPStatus.INTERNAL_SERVER_ERROR,
                                         pm_logger), None

    # ログID(UUID(v4))
    log_id = common_utils.get_uuid4()

    # AWS Batch
    job_name = code + "-" + log_id
    job_queue = report_job_def['JobQueue']
    job_definition = report_job_def['JobDefinition']
    parameters = {
        "ReportID": "--reportId=" + report_id,
        "LogID": "--logId=" + log_id
    }
    container_overrides = {}
    if (common_utils.check_key('Environment', report_job_def)
            and len(report_job_def['Environment']) > 0):
        container_overrides = report_job_def['Environment']
    max_retry = report_job_def['MaxRetry']

    try:
        # submid job
        job_id, parameter = aws_common.submit_job(trace_id, job_name,
                                                  job_queue, job_id,
                                                  job_definition, parameters,
                                                  container_overrides,
                                                  max_retry)
    except PmError as e:
        return common_utils.error_exception(MsgConst.ERR_AWS_601,
                                            HTTPStatus.INTERNAL_SERVER_ERROR,
                                            e, pm_logger, True), None
    # Create ReportJobLogs
    user_id = trace_id
    # 配列内のオブジェクトとして格納されていたので、job_idのみを抽出する(暫定対応)
    job_id_key = job_id[0]['jobId']

    date_now = common_utils.get_current_date()
    try:
        report_log = {
            'ReportID': report_id,
            'LogID': log_id,
            'Code': code,
            'UserID': user_id,
            'MailAddress': email,
            'JobID': job_id_key,
            'Parameter': parameter,
            'CreatedAt': date_now,
            'UpdatedAt': date_now
        }
        s3_file_name = CommonConst.PATH_REPORT_BATCH.format(
            report_id, log_id + ".json")
        FileUtils.upload_json(trace_id, "S3_BATCH_LOG_BUCKET", report_log,
                              s3_file_name)
    except PmError as e:
        return common_utils.error_exception(MsgConst.ERR_S3_701,
                                            HTTPStatus.INTERNAL_SERVER_ERROR,
                                            e, pm_logger, True), None
    return common_utils.response(None, pm_logger), job_id
Ejemplo n.º 30
0
def update_awscoop(trace_id, project_id, organization_id, coop_id, data_body):
    pm_logger = common_utils.begin_logger(trace_id, __name__,
                                          inspect.currentframe())
    # Parse JSON
    try:
        body_object = json.loads(data_body)
        aws_account = body_object["awsAccount"]
        role_name = body_object["roleName"]
        description = body_object["description"]
        aws_account_name = body_object['awsAccountName']
    except Exception as e:
        return common_utils.error_exception(MsgConst.ERR_REQUEST_202,
                                            HTTPStatus.BAD_REQUEST, e,
                                            pm_logger, True)

    # Validate
    list_error = validate_update_awscoop(aws_account, role_name)
    if list_error:
        return common_utils.error_validate(MsgConst.ERR_REQUEST_201,
                                           HTTPStatus.UNPROCESSABLE_ENTITY,
                                           list_error, pm_logger)

    # Get data AWSアカウント連携
    try:
        awscoops_item = pm_awsAccountCoops.get_awscoops_update(
            trace_id, coop_id, project_id, organization_id)
    except PmError as e:
        return common_utils.error_exception(MsgConst.ERR_402,
                                            HTTPStatus.INTERNAL_SERVER_ERROR,
                                            e, pm_logger, True)

    # 組織情報を取得します。
    if awscoops_item is None:
        return common_utils.error_common(MsgConst.ERR_301,
                                         HTTPStatus.NOT_FOUND, pm_logger)

    # ロールのアクセス確認
    if common_utils.is_null(description):
        description = None
    if common_utils.is_null(aws_account_name):
        aws_account_name = None
    external_id = awscoops_item['ExternalID']
    effective = Effective.Disable.value
    members = None
    if (checkaccess.check_access_to_aws(trace_id, aws_account, role_name,
                                        external_id)):
        effective = Effective.Enable.value

        # IAMクライアントを用いて、IAMロールcm-membersportalを取得します。
        try:
            session = aws_common.create_session_client(trace_id, aws_account,
                                                       role_name, external_id)
            members = IAMUtils.get_membership_aws_account(
                trace_id, session, aws_account)
        except PmError as e:
            common_utils.write_log_pm_error(e, pm_logger, exc_info=True)

    # update project
    attribute = {
        'AWSAccount': {
            "Value": aws_account
        },
        'RoleName': {
            "Value": role_name
        },
        'Description': {
            "Value": description
        },
        'Effective': {
            "Value": effective
        },
        'AWSAccountName': {
            "Value": aws_account_name
        }
    }
    if (members is not None):
        attribute['Members'] = {"Value": members}
    updated_at = awscoops_item['UpdatedAt']

    try:
        pm_awsAccountCoops.update_awscoops(trace_id, coop_id, attribute,
                                           updated_at)
    except PmError as e:
        return common_utils.error_exception(MsgConst.ERR_DB_403,
                                            HTTPStatus.INTERNAL_SERVER_ERROR,
                                            e, pm_logger, True)

    # Get data response
    try:
        awscoops_item = pm_awsAccountCoops.query_awscoop_coop_key(
            trace_id, coop_id, convert_response=True)
    except PmError as e:
        return common_utils.error_exception(MsgConst.ERR_402,
                                            HTTPStatus.INTERNAL_SERVER_ERROR,
                                            e, pm_logger, True)

    # return data response
    response = common_utils.get_response_by_response_body(
        HTTPStatus.OK, awscoops_item)
    return common_utils.response(response, pm_logger)