Skip to content

Commit 7048c43

Browse files
authored
Merge pull request #26 from nexB/json_api
JSON API #8
2 parents 95f725f + 2c5f78d commit 7048c43

28 files changed

Lines changed: 350 additions & 61 deletions

.travis.yml

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,14 @@ python: 3.6
33

44
install:
55
- pip install -r requirements.txt
6-
- pip install pycodestyle
76

87
before_script:
98
- pycodestyle --exclude=migrations,settings.py,lib,tests --max-line-length=100 .
10-
- cd app/
11-
- python3 manage.py migrate
9+
- ./manage.py migrate
1210

1311
script:
14-
- python3.6 -m pytest -v tests/
15-
- python3.6 manage.py test
12+
- python3.6 -m pytest -v vulnerabilities/tests/test_scrapers.py vulnerabilities/tests/test_api_data.py
13+
- ./manage.py test vulnerabilities/tests
1614

1715
notifications:
1816
email: false

README.md

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,39 +18,52 @@ Activate a virtualenv, install dependencies, and run the database migrations:
1818
python3.6 -m venv .
1919
source bin/activate
2020
pip install -r requirements.txt
21-
app/manage.py migrate
21+
./manage.py migrate
2222
```
2323

2424
Tests
2525
-----
2626

2727
```
2828
pycodestyle --exclude=migrations,settings.py,lib,tests --max-line-length=100 .
29-
cd app/
30-
python3.6 -m pytest -v tests/
29+
python3.6 -m pytest -v vulnerabilities/tests/test_scrapers.py vulnerabilities/tests/test_api_data.py
3130
```
3231

3332
For Django based tests
3433
```
35-
cd app/
36-
./manage.py test
34+
./manage.py test vulnerabilities/tests
3735
```
3836

3937
Scrape and save to the database
4038
-------------------------------
4139

4240
```
43-
cd app/
4441
./manage.py shell
4542
```
4643

4744
```
48-
from scraper import debian, ubuntu
49-
from vulncode_app.data_dump import debian_dump, ubuntu_dump
45+
from vulnerabilities.scraper import debian, ubuntu
46+
from vulnerabilities.data_dump import debian_dump, ubuntu_dump
47+
48+
# May be needed on macOS
49+
# import ssl; ssl._create_default_https_context = ssl._create_unverified_context
5050
51-
debian_vulnerabilities = debian.scrape_vulnerabilities()
5251
ubuntu_cves = ubuntu.scrape_cves()
52+
ubuntu_dump(ubuntu_cves)
5353
54+
debian_vulnerabilities = debian.scrape_vulnerabilities()
5455
debian_dump(debian_vulnerabilities)
55-
ubuntu_dump(ubuntu_cves)
56+
```
57+
58+
API
59+
----
60+
Start the webserver
61+
62+
```
63+
./manage.py runserver
64+
```
65+
66+
In your browser access:
67+
```
68+
http://127.0.0.1:8000/vulnerabilities/api/<package_name>
5669
```

app/manage.py renamed to manage.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import sys
44

55
if __name__ == "__main__":
6-
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "app.settings")
6+
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "vulnerablecode.settings")
77
try:
88
from django.core.management import execute_from_command_line
99
except ImportError:

requirements.txt

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
1+
setuptools==36.5.0
2+
13
beautifulsoup4==4.6.0
2-
lxml==3.8.0
3-
django==1.11.4
4+
lxml==4.0.0
5+
django==1.11.5
6+
djangorestframework==3.6.4
47

58
# Tests
6-
pytest==3.1.3
9+
pytest==3.2.2
10+
pycodestyle==2.3.1
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,5 @@
44
from django.apps import AppConfig
55

66

7-
class VulncodeAppConfig(AppConfig):
8-
name = 'vulncode_app'
7+
class VulnerabilitiesAppConfig(AppConfig):
8+
name = 'vulnerabilities'
Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,10 @@
2121
# VulnerableCode is a free software code scanning tool from nexB Inc. and others.
2222
# Visit https://github.com/nexB/vulnerablecode/ for support and download.
2323

24-
from vulncode_app.models import Vulnerability
25-
from vulncode_app.models import VulnerabilityReference
26-
from vulncode_app.models import Package
24+
from vulnerabilities.models import ImpactedPackage
25+
from vulnerabilities.models import Package
26+
from vulnerabilities.models import Vulnerability
27+
from vulnerabilities.models import VulnerabilityReference
2728

2829

2930
def debian_dump(extract_data):
@@ -38,10 +39,14 @@ def debian_dump(extract_data):
3839
vulnerability=vulnerability,
3940
reference_id=data.get('vulnerability_id', ''),
4041
)
41-
Package.objects.create(
42+
package = Package.objects.create(
4243
name=data.get('package_name', ''),
4344
version=data.get('fixed_version', ''),
4445
)
46+
ImpactedPackage.objects.create(
47+
vulnerability=vulnerability,
48+
package=package
49+
)
4550

4651

4752
def ubuntu_dump(html):
@@ -56,6 +61,10 @@ def ubuntu_dump(html):
5661
vulnerability=vulnerability,
5762
reference_id=data.get('cve_id'),
5863
)
59-
Package.objects.create(
64+
package = Package.objects.create(
6065
name=data.get('package_name'),
6166
)
67+
ImpactedPackage.objects.create(
68+
vulnerability=vulnerability,
69+
package=package
70+
)

app/vulncode_app/migrations/0001_initial.py renamed to vulnerabilities/migrations/0001_initial.py

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# -*- coding: utf-8 -*-
2-
# Generated by Django 1.11.4 on 2017-08-08 09:11
2+
# Generated by Django 1.11.4 on 2017-09-20 22:34
33
from __future__ import unicode_literals
44

55
from django.db import migrations, models
@@ -37,14 +37,14 @@ class Migration(migrations.Migration):
3737
('platform', models.CharField(blank=True, help_text='Platform eg:maven', max_length=50)),
3838
('name', models.CharField(blank=True, help_text='Package reference name eg:org.apache.commons.io', max_length=50)),
3939
('version', models.CharField(blank=True, help_text='Reference version', max_length=50)),
40-
('package', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='vulncode_app.Package')),
40+
('package', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='vulnerabilities.Package')),
4141
],
4242
),
4343
migrations.CreateModel(
4444
name='ResolvedPackage',
4545
fields=[
4646
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
47-
('package', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='vulncode_app.Package')),
47+
('package', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='vulnerabilities.Package')),
4848
],
4949
),
5050
migrations.CreateModel(
@@ -59,29 +59,33 @@ class Migration(migrations.Migration):
5959
name='VulnerabilityReference',
6060
fields=[
6161
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
62-
('source', models.CharField(blank=True, help_text="Source's name eg:NVD", max_length=50)),
62+
('source', models.CharField(blank=True, help_text='Source(s) name eg:NVD', max_length=50)),
6363
('reference_id', models.CharField(blank=True, help_text='Reference ID, eg:CVE-ID', max_length=50)),
6464
('url', models.URLField(blank=True, help_text='URL of Vulnerability data', max_length=1024)),
65-
('vulnerability', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='vulncode_app.Vulnerability')),
65+
('vulnerability', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='vulnerabilities.Vulnerability')),
6666
],
6767
),
6868
migrations.AddField(
6969
model_name='resolvedpackage',
7070
name='vulnerability',
71-
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='vulncode_app.Vulnerability'),
71+
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='vulnerabilities.Vulnerability'),
7272
),
7373
migrations.AddField(
7474
model_name='impactedpackage',
7575
name='package',
76-
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='vulncode_app.Package'),
76+
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='vulnerabilities.Package'),
7777
),
7878
migrations.AddField(
7979
model_name='impactedpackage',
8080
name='vulnerability',
81-
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='vulncode_app.Vulnerability'),
81+
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='vulnerabilities.Vulnerability'),
8282
),
8383
migrations.AlterUniqueTogether(
8484
name='vulnerabilityreference',
85-
unique_together=set([('vulnerability', 'source', 'reference_id')]),
85+
unique_together=set([('vulnerability', 'source', 'reference_id', 'url')]),
86+
),
87+
migrations.AlterUniqueTogether(
88+
name='impactedpackage',
89+
unique_together=set([('vulnerability', 'package')]),
8690
),
8791
]
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# -*- coding: utf-8 -*-
2+
# Generated by Django 1.11.5 on 2017-09-22 19:18
3+
from __future__ import unicode_literals
4+
5+
from django.db import migrations, models
6+
7+
8+
class Migration(migrations.Migration):
9+
10+
dependencies = [
11+
('vulnerabilities', '0001_initial'),
12+
]
13+
14+
operations = [
15+
migrations.AddField(
16+
model_name='package',
17+
name='vulnerabilities',
18+
field=models.ManyToManyField(through='vulnerabilities.ImpactedPackage', to='vulnerabilities.Vulnerability'),
19+
),
20+
]

0 commit comments

Comments
 (0)