Exemple #1
0
def submit_issue(event, context, is_test=False, session=None):

    helper.log_method_initiated("Submit issue", event, logger)

    if session == None:
        session = get_db_session(is_test, session)

    issue = Issue()  #create object from issue_model.py (DB table: issues)
    issue = helper.body_to_object(event['body'], issue)
    # add ip address
    try:
        ip_address = event['requestContext']['identity']['sourceIp']
        setattr(issue, 'ip_address', ip_address)
    except Exception:
        response = {
            "statusCode":
            400,
            "body":
            "Could not read/add ip address. Check HTTP POST payload. Stacktrace: {}"
            .format(traceback.format_exc())
        }

    issue = add_object(issue, is_test, session)
    if issue is None:
        response = {
            "statusCode":
            400,
            "body":
            "Could not write issue to database. Check HTTP POST payload. Stacktrace: {}"
            .format(traceback.format_exc())
        }
        response_cors = helper.set_cors(response, event, is_test)
        return response_cors

    response = send_issue_notification(issue)
    if response == False:
        response = {
            "statusCode":
            500,
            "body":
            "Could not send issue mail. Stacktrace: {}".format(
                traceback.format_exc())
        }
        response_cors = helper.set_cors(response, event, is_test)
        return response_cors

    else:
        response = {"statusCode": 201, "body": json.dumps(issue.to_dict())}
        response_cors = helper.set_cors(response, event, is_test)
        return response_cors
Exemple #2
0
def submit_issue(event, context, is_test=False, session=None):

    helper.log_method_initiated("Submit issue", event, logger)

    if session == None:
        session = get_db_session(is_test, session)

    issue = Issue()
    issue = helper.body_to_object(event['body'], issue)

    issue = add_object(issue, is_test, session)
    if issue is None:
        response = {
            "statusCode":
            400,
            "body":
            "Could not write issue to database. Check HTTP POST payload. Stacktrace: {}"
            .format(traceback.format_exc())
        }
        response_cors = helper.set_cors(response, event, is_test)
        return response_cors

    response = send_issue_notification(issue)
    if response == False:
        response = {
            "statusCode":
            500,
            "body":
            "Could not send issue mail. Stacktrace: {}".format(
                traceback.format_exc())
        }
        response_cors = helper.set_cors(response, event, is_test)
        return response_cors

    else:
        response = {"statusCode": 201, "body": json.dumps(issue.to_dict())}
        response_cors = helper.set_cors(response, event, is_test)
        return response_cors
def submit_item(event, context):
    client = boto3.client('stepfunctions', region_name="eu-central-1")

    helper.log_method_initiated("Item submission", event, logger)

    with Session() as session:

        try:
            body = event['body']

            if isinstance(body, str):
                body_dict = json.loads(body)
            else:
                body_dict = body
            content = body_dict["content"]
            del body_dict["content"]

            if "type" in body_dict:
                type = body_dict["type"]
                del body_dict["type"]
            else:
                type = None

            if "item_type_id" in body_dict:
                item_type_id = body_dict["item_type_id"]
                del body_dict["item_type_id"]
            else:
                item_type_id = None

            if "item" in body_dict:
                del body_dict["item"]

            submission = Submission()
            helper.body_to_object(body_dict, submission)
            # add ip address
            ip_address = event['requestContext']['identity']['sourceIp']
            setattr(submission, 'ip_address', ip_address)

            try:
                # Item already exists, item_id in submission is the id of the found item
                item = item_handler.get_item_by_content(content, session)
                submission.item_id = item.id
                new_item_created = False

            except Exception:
                # Item does not exist yet, item_id in submission is the id of the newly created item
                item = Item()
                item.content = content
                item.item_type_id = item_type_id
                item.type = type
                item = item_handler.create_item(item, session)
                new_item_created = True

                if content:
                    str_urls = re.findall(
                        'http[s]?://(?:[a-zA-ZäöüÄÖÜ]|[0-9]|[$-_@.&+]|[!*(),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+',
                        content)
                    url_handler.prepare_and_store_urls(item, str_urls, session)

                submission.item_id = item.id
                submission.status = item.status

            # Create submission
            submission_handler.create_submission_db(submission, session)
            if submission.mail:
                if item.status != 'Unsafe':
                    send_confirmation_mail(submission)

            # Create response
            if item.status == 'Unsafe':
                response = {
                    "statusCode": 403,
                    "headers": {
                        "content-type": "application/json; charset=utf-8",
                        "new-item-created": str(new_item_created)
                    },
                    "body": "Item not valid"
                }
            else:
                response = {
                    "statusCode": 201,
                    "headers": {
                        "content-type": "application/json; charset=utf-8",
                        "new-item-created": str(new_item_created)
                    },
                    "body": json.dumps(item.to_dict())
                }

        except Exception as e:
            logger.error("Couldn't submit item. Exception: %s", e)
            response = {
                "statusCode":
                400,
                "body":
                "Could not create item and/or submission. Check HTTP POST payload. Stacktrace: {}"
                .format(traceback.format_exc())
            }

    ## start SearchFactChecks only for safe items
    if (item.status != 'Unsafe') and (new_item_created == True):
        stage = os.environ['STAGE']
        client.start_execution(
            stateMachineArn=
            'arn:aws:states:eu-central-1:891514678401:stateMachine:SearchFactChecks_new-'
            + stage,
            name='SFC_' + item.id,
            input="{\"item\":{"
            "\"id\":\"" + item.id + "\","
            "\"content\":\"" + remove_control_characters(item.content) +
            "\" } }")

    response_cors = helper.set_cors(response, event)
    return response_cors
Exemple #4
0
def test_submit_issue(good_event, bad_event):

    conn = boto3.client("ses", region_name="eu-central-1")
    conn.verify_email_identity(EmailAddress="*****@*****.**")

    with Session() as session:
        # Send good event
        response = submit_issue(good_event, None)
        # Check response
        assert response['statusCode'] == 201
        assert good_event['body']['message'] in response['body']
        # Check e-mail notification
        send_quota = conn.get_send_quota()
        sent_count = int(send_quota["SentLast24Hours"])
        assert sent_count == 1
        message = ses_backend.sent_messages[0]
        assert '*****@*****.**' in message.destinations['ToAddresses']
        assert good_event['body']['message'] in message.body
        # Check database entry
        issue_count = session.query(Issue).count()
        issue = session.query(Issue).first()
        assert issue.ip_address == '1.2.3.4'
        assert issue_count == 1

        # Send bad event
        response = submit_issue(bad_event, None)
        # Check response
        assert response['statusCode'] == 400
        # Check e-mail notification
        send_quota = conn.get_send_quota()
        sent_count = int(send_quota["SentLast24Hours"])
        assert sent_count == 1
        # Check database entry
        issue_count = session.query(Issue).count()
        assert issue_count == 1

        # Send item event
        item = get_item('Content TestItem 111')
        session.add(item)
        session.commit()

        item_event = get_item_event(item)
        response = submit_issue(item_event, None)

        # Check response
        assert response['statusCode'] == 201
        assert item_event['body']['message'] in response['body']
        issue = Issue()
        issue = body_to_object(response['body'], issue)
        assert issue.message == "This is a feedback."

        # Check e-mail notification
        send_quota = conn.get_send_quota()
        sent_count = int(send_quota["SentLast24Hours"])
        assert sent_count == 2
        message = ses_backend.sent_messages[1]
        assert '*****@*****.**' in message.destinations['ToAddresses']
        assert item_event['body']['message'] in message.body
        assert item.id in message.body
        assert item.content in message.body

        # Check database entry
        issue_count = session.query(Issue).count()
        assert issue_count == 2

        # Send item-event with another item
        item = get_item('Content TestItem 222')
        session.add(item)
        session.commit()
        item_event = get_item_event(item, 'complaint', 'This is a complaint.')
        response = submit_issue(item_event, None)

        # Check response
        assert response['statusCode'] == 201
        assert item_event['body']['message'] in response['body']
        issue = Issue()
        issue = body_to_object(response['body'], issue)
        assert issue.message == "This is a complaint."

        # Check database entry
        issue_count = session.query(Issue).count()
        assert issue_count == 3
def submit_item(event, context, is_test=False, session=None):

    client = boto3.client('stepfunctions', region_name="eu-central-1")

    helper.log_method_initiated("Item submission", event, logger)

    if session == None:
        session = connection_handler.get_db_session(False, None)

    try:
        body = event['body']

        if isinstance(body, str):
            body_dict = json.loads(body)
        else:
            body_dict = body
        content = body_dict["content"]
        del body_dict["content"]

        if ("type" in body_dict):
            type = body_dict["type"]
            del body_dict["type"]
        else:
            type = None

        if ("item_type_id" in body_dict):
            item_type_id = body_dict["item_type_id"]
            del body_dict["item_type_id"]
        else:
            item_type_id = None

        submission = Submission()
        helper.body_to_object(body_dict, submission)
        # add ip address
        ip_address = event['requestContext']['identity']['sourceIp']
        setattr(submission, 'ip_address', ip_address)

        try:
            # Item already exists, item_id in submission is the id of the found item
            item = item_handler.get_item_by_content(content, is_test, session)
            submission.item_id = item.id
            new_item_created = False

        except Exception:
            # Item does not exist yet, item_id in submission is the id of the newly created item
            item = Item()
            item.content = content
            item.item_type_id = item_type_id
            item.type = type
            item = item_handler.create_item(item, is_test, session)
            new_item_created = True
            submission.item_id = item.id
            stage = os.environ['STAGE']
            client.start_execution(
                stateMachineArn=
                'arn:aws:states:eu-central-1:891514678401:stateMachine:SearchFactChecks_new-'
                + stage,
                name='SFC_' + item.id,
                input="{\"item\":{"
                "\"id\":\"" + item.id + "\","
                "\"content\":\"" + remove_control_characters(item.content) +
                "\" } }")

        # Create submission
        submission_handler.create_submission_db(submission, is_test, session)
        if submission.mail:
            send_confirmation_mail(submission)

        response = {
            "statusCode": 201,
            'headers': {
                "content-type": "application/json; charset=utf-8",
                "new-item-created": str(new_item_created)
            },
            "body": json.dumps(item.to_dict())
        }

    except Exception:
        response = {
            "statusCode":
            400,
            "body":
            "Could not create item and/or submission. Check HTTP POST payload. Stacktrace: {}"
            .format(traceback.format_exc())
        }

    response_cors = helper.set_cors(response, event, is_test)
    return response_cors