Beispiel #1
0
 def _create_vendor(vendor_name, product_name=None):
     vendor = Vendor(name=vendor_name)
     if product_name:
         vendor.products.append(Product(name=product_name))
     db.session.add(vendor)
     db.session.commit()
     return vendor
Beispiel #2
0
def test_product_with_users():
    product = Product(
        name="Requests",
        vendor=Vendor(name="Python"),
        users=[User(username="******"),
               User(username="******")],
    )
    assert len(product.users) == 2
    assert [u.username for u in product.users] == ["nicolas", "laurent"]
Beispiel #3
0
 def _create_vendor(vendor_name, product_name=None):
     vendor = Vendor.query.filter_by(name=vendor_name).first()
     if not vendor:
         vendor = Vendor(name=vendor_name)
     if product_name:
         vendor.products.append(Product(name=product_name))
     db.session.add(vendor)
     db.session.commit()
     return vendor
Beispiel #4
0
def test_subscription_without_changes(client, login):
    user = User.query.first()
    vendor = Vendor(name="opencve")
    db.session.add(vendor)
    user.vendors.append(vendor)
    db.session.commit()

    response = client.get("/")
    assert response.status_code == 200
    assert b"No changes available." in response.data
Beispiel #5
0
def test_vendor_with_products():
    vendor = Vendor(
        name="Python",
        products=[
            Product(name="Requests"),
            Product(name="Celery"),
            Product(name="Virtualenv"),
        ],
    )

    assert len(vendor.products) == 3
    assert [p.name
            for p in vendor.products] == ["Requests", "Celery", "Virtualenv"]
Beispiel #6
0
    def execute(self):
        old = nested_lookup("cpe23Uri", self.cve_obj.json["configurations"])
        new = nested_lookup("cpe23Uri", self.cve_json["configurations"])

        payload = {
            "added": list(set(new) - set(old)),
            "removed": list(set(old) - set(new)),
        }

        # The CPEs list has been modified
        if payload["added"] or payload["removed"]:

            # Change the CVE's vendors attribute
            self.cve_obj.vendors = flatten_vendors(
                convert_cpes(self.cve_json["configurations"])
            )
            db.session.commit()

            # Create the vendors and products objects if they don't exist
            vendors_products = convert_cpes(payload["added"])

            for vendor, products in vendors_products.items():
                v_obj = Vendor.query.filter_by(name=vendor).first()

                # Create the vendor and associate it to the CVE
                if not v_obj:
                    v_obj = Vendor(name=vendor)
                    db.session.add(v_obj)
                    db.session.commit()

                # Do the same for its products
                for product in products:
                    p_obj = Product.query.filter_by(name=product, vendor=v_obj).first()
                    if not p_obj:
                        p_obj = Product(name=product, vendor=v_obj)
                        db.session.add(p_obj)
                        db.session.commit()

            # Create the event
            event = CveUtil.create_event(self.cve_obj, self.cve_json, "cpes", payload)
            return event

        return None
Beispiel #7
0
def test_empty_vendor():
    vendor = Vendor(name="Python")
    assert str(vendor) == "<Vendor Python>"
    assert vendor.name == "Python"
    assert vendor.products == []
    assert vendor.users == []
Beispiel #8
0
def test_new_product():
    product = Product(name="Requests", vendor=Vendor(name="Python"))
    assert str(product) == "<Product Requests>"
    assert product.name == "Requests"
    assert product.vendor.name == "Python"
Beispiel #9
0
def test_vendor_with_users():
    vendor = Vendor(name="Python",
                    users=[User(username="******"),
                           User(username="******")])
    assert len(vendor.users) == 2
    assert [u.username for u in vendor.users] == ["nicolas", "laurent"]
Beispiel #10
0
    def create_cve(cls, cve_json):
        cvss2 = (cve_json["impact"]["baseMetricV2"]["cvssV2"]["baseScore"]
                 if "baseMetricV2" in cve_json["impact"] else None)
        cvss3 = (cve_json["impact"]["baseMetricV3"]["cvssV3"]["baseScore"]
                 if "baseMetricV3" in cve_json["impact"] else None)

        # Construct CWE and CPE lists
        cwes = get_cwes(cve_json["cve"]["problemtype"]["problemtype_data"][0]
                        ["description"])
        cpes = convert_cpes(cve_json["configurations"])
        vendors = flatten_vendors(cpes)

        # Create the CVE
        cve = Cve(
            cve_id=cve_json["cve"]["CVE_data_meta"]["ID"],
            summary=cve_json["cve"]["description"]["description_data"][0]
            ["value"],
            json=cve_json,
            vendors=vendors,
            cwes=cwes,
            cvss2=cvss2,
            cvss3=cvss3,
            created_at=arrow.get(cve_json["publishedDate"]).datetime,
            updated_at=arrow.get(cve_json["lastModifiedDate"]).datetime,
        )
        db.session.add(cve)
        db.session.commit()

        # Add the CWE that not exists yet in database
        for cwe in cwes:
            cwe_obj = Cwe.query.filter_by(cwe_id=cwe).first()
            if not cwe_obj:
                info(
                    f"{cwe} detected in {cve.cve_id} but not existing in database, adding it..."
                )
                cwe_obj = Cwe(cwe_id=cwe)
                db.session.add(cwe_obj)
                db.session.commit()

        # Add the CPEs
        vendors_products = convert_cpes(
            nested_lookup("cpe23Uri", cve_json["configurations"]))
        for vendor, products in vendors_products.items():
            v_obj = Vendor.query.filter_by(name=vendor).first()

            # Create the vendor
            if not v_obj:
                v_obj = Vendor(name=vendor)
                db.session.add(v_obj)
                db.session.commit()

            # Create the products
            for product in products:
                p_obj = Product.query.filter_by(name=product,
                                                vendor=v_obj).first()
                if not p_obj:
                    p_obj = Product(name=product, vendor=v_obj)
                    db.session.add(p_obj)
                    db.session.commit()

        return cve