Beispiel #1
0
def check_serial_limit(serial_resource):
    serial_counter = serial_resource["serial_counter"]
    serial_date = serial_resource["serial_date"]
    today_date = helpers.soa_time_set()

    if int(serial_counter) > 97 and serial_date == today_date:
        # knot maximum of nn is 99
        # 97 was chosen because serial
        # increment can be twice at time
        raise ValueError("Zone Change Limit Reached")
Beispiel #2
0
def insert_soa_rdata(record_id):
    """Insert default SOA record.

    Notes:
    <MNAME> <RNAME> <serial> <refresh> <retry> <expire> <minimum>
    See: https://tools.ietf.org/html/rfc1035 (3.3.13. SOA RDATA format)
    """
    current_time = helpers.soa_time_set()
    serial = f"{str(current_time)}01"
    default_soa_content = os.environ.get("DEFAULT_SOA_RDATA")
    rdatas = default_soa_content.split(" ")
    # rdata doesn't contains serial
    mname_and_rname = " ".join(rdatas[0:2])
    ttls = " ".join(rdatas[2:])

    rdata = f"{mname_and_rname} {serial} {ttls}"
    content_data = {"rdata": rdata, "record_id": record_id}

    model.insert(table="rdata", data=content_data)
Beispiel #3
0
    def test_edit_record_respect_zone_limit(self, client, monkeypatch, mocker):
        """Test edit record respecting zone limit of 99

        - Create a User
        - Create a domain (with default SOA, NS, CNAME created)
        - Add TXT record
        - Edit a record with the different TXT value until it reaches a limit
        - Edit a record with tomorrows date
        """
        mocker.patch("app.helpers.producer.kafka_producer")
        mocker.patch("app.helpers.producer.send")
        headers = {"X-Api-Key": "123"}

        # create user
        data = {"email": "*****@*****.**"}
        post_res = client.post("/api/user/add", data=data, headers=headers)
        json_data = post_res.get_json()
        user_id = json_data["data"]["id"]

        # add domain
        data = {"zone": "company.com", "user_id": user_id}
        client.post("/api/domain/add", data=data, headers=headers)

        # add record
        data = {
            "zone": "company.com",
            "owner": "txt1",
            "rtype": "TXT",
            "rdata": "0",
            "ttl": 7200,
        }
        res = client.post("/api/record/add", data=data, headers=headers)
        json_data = res.get_json()
        record_id = json_data["data"]["id"]

        increment_serial = 0
        # 50 times for edit record is enough to make serial > 99
        # record edit increment serial twice at time
        while increment_serial < 50:
            data = {
                "zone": "company.com",
                "owner": "txt1",
                "rtype": "TXT",
                "rdata": f"{increment_serial}",
                "ttl": 7200,
            }
            res = client.put(f"/api/record/edit/{record_id}",
                             data=data,
                             headers=headers)
            edit_record_data = res.get_json()

            increment_serial += 1

        assert edit_record_data["code"] == 429
        assert edit_record_data["message"] == "Zone Change Limit Reached"

        # ensure correct serial
        serial_resource = record_api.get_serial_resource("company.com")
        today_date = helpers.soa_time_set()

        assert serial_resource["serial_counter"] == "98"
        assert serial_resource["serial_date"] == today_date
        assert serial_resource["serial"] == f"{today_date}98"

        #
        # if user waits until tomorrow
        #
        def fake_soa_time_set():
            tomorrow_date = datetime.datetime.now() + datetime.timedelta(
                days=1)
            return tomorrow_date.strftime("%Y%m%d")

        monkeypatch.setattr(app.helpers.helpers, "soa_time_set",
                            fake_soa_time_set)
        data = {
            "zone": "company.com",
            "owner": "txt1",
            "rtype": "TXT",
            "rdata": "random text",
            "ttl": 7200,
        }
        res = client.put(f"/api/record/edit/{record_id}",
                         data=data,
                         headers=headers)
        edit_record_data = res.get_json()

        assert edit_record_data["code"] == 200

        # ensure correct serial
        serial_resource = record_api.get_serial_resource("company.com")
        today_date = helpers.soa_time_set()

        assert serial_resource["serial_counter"] == "03"
        assert serial_resource["serial_date"] == today_date
        assert serial_resource["serial"] == f"{today_date}03"