diff --git a/.travis.yml b/.travis.yml index e358372d2..c545c0ebe 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,16 +3,14 @@ python: 3.6 install: - pip install -r requirements.txt - - pip install pycodestyle before_script: - pycodestyle --exclude=migrations,settings.py,lib,tests --max-line-length=100 . - - cd app/ - - python3 manage.py migrate + - ./manage.py migrate script: - - python3.6 -m pytest -v tests/ - - python3.6 manage.py test + - python3.6 -m pytest -v vulnerabilities/tests/test_scrapers.py vulnerabilities/tests/test_api_data.py + - ./manage.py test vulnerabilities/tests notifications: email: false diff --git a/README.md b/README.md index f7deaa486..3998d21be 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ Activate a virtualenv, install dependencies, and run the database migrations: python3.6 -m venv . source bin/activate pip install -r requirements.txt -app/manage.py migrate +./manage.py migrate ``` Tests @@ -26,31 +26,44 @@ Tests ``` pycodestyle --exclude=migrations,settings.py,lib,tests --max-line-length=100 . -cd app/ -python3.6 -m pytest -v tests/ +python3.6 -m pytest -v vulnerabilities/tests/test_scrapers.py vulnerabilities/tests/test_api_data.py ``` For Django based tests ``` -cd app/ -./manage.py test +./manage.py test vulnerabilities/tests ``` Scrape and save to the database ------------------------------- ``` -cd app/ ./manage.py shell ``` ``` -from scraper import debian, ubuntu -from vulncode_app.data_dump import debian_dump, ubuntu_dump +from vulnerabilities.scraper import debian, ubuntu +from vulnerabilities.data_dump import debian_dump, ubuntu_dump + +# May be needed on macOS +# import ssl; ssl._create_default_https_context = ssl._create_unverified_context -debian_vulnerabilities = debian.scrape_vulnerabilities() ubuntu_cves = ubuntu.scrape_cves() +ubuntu_dump(ubuntu_cves) +debian_vulnerabilities = debian.scrape_vulnerabilities() debian_dump(debian_vulnerabilities) -ubuntu_dump(ubuntu_cves) +``` + +API +---- +Start the webserver + +``` +./manage.py runserver +``` + +In your browser access: +``` +http://127.0.0.1:8000/vulnerabilities/api/ ``` diff --git a/app/manage.py b/manage.py similarity index 90% rename from app/manage.py rename to manage.py index 7525f8727..e96501b79 100755 --- a/app/manage.py +++ b/manage.py @@ -3,7 +3,7 @@ import sys if __name__ == "__main__": - os.environ.setdefault("DJANGO_SETTINGS_MODULE", "app.settings") + os.environ.setdefault("DJANGO_SETTINGS_MODULE", "vulnerablecode.settings") try: from django.core.management import execute_from_command_line except ImportError: diff --git a/requirements.txt b/requirements.txt index 889b545db..048ff222b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,10 @@ +setuptools==36.5.0 + beautifulsoup4==4.6.0 -lxml==3.8.0 -django==1.11.4 +lxml==4.0.0 +django==1.11.5 +djangorestframework==3.6.4 # Tests -pytest==3.1.3 +pytest==3.2.2 +pycodestyle==2.3.1 diff --git a/app/app/__init__.py b/vulnerabilities/__init__.py similarity index 100% rename from app/app/__init__.py rename to vulnerabilities/__init__.py diff --git a/app/vulncode_app/api_data.py b/vulnerabilities/api_data.py similarity index 100% rename from app/vulncode_app/api_data.py rename to vulnerabilities/api_data.py diff --git a/app/vulncode_app/apps.py b/vulnerabilities/apps.py similarity index 58% rename from app/vulncode_app/apps.py rename to vulnerabilities/apps.py index 66e79cbd6..8decd30f6 100644 --- a/app/vulncode_app/apps.py +++ b/vulnerabilities/apps.py @@ -4,5 +4,5 @@ from django.apps import AppConfig -class VulncodeAppConfig(AppConfig): - name = 'vulncode_app' +class VulnerabilitiesAppConfig(AppConfig): + name = 'vulnerabilities' diff --git a/app/vulncode_app/data_dump.py b/vulnerabilities/data_dump.py similarity index 81% rename from app/vulncode_app/data_dump.py rename to vulnerabilities/data_dump.py index 71bcd44bc..45d94515e 100644 --- a/app/vulncode_app/data_dump.py +++ b/vulnerabilities/data_dump.py @@ -21,9 +21,10 @@ # VulnerableCode is a free software code scanning tool from nexB Inc. and others. # Visit https://github.com/nexB/vulnerablecode/ for support and download. -from vulncode_app.models import Vulnerability -from vulncode_app.models import VulnerabilityReference -from vulncode_app.models import Package +from vulnerabilities.models import ImpactedPackage +from vulnerabilities.models import Package +from vulnerabilities.models import Vulnerability +from vulnerabilities.models import VulnerabilityReference def debian_dump(extract_data): @@ -38,10 +39,14 @@ def debian_dump(extract_data): vulnerability=vulnerability, reference_id=data.get('vulnerability_id', ''), ) - Package.objects.create( + package = Package.objects.create( name=data.get('package_name', ''), version=data.get('fixed_version', ''), ) + ImpactedPackage.objects.create( + vulnerability=vulnerability, + package=package + ) def ubuntu_dump(html): @@ -56,6 +61,10 @@ def ubuntu_dump(html): vulnerability=vulnerability, reference_id=data.get('cve_id'), ) - Package.objects.create( + package = Package.objects.create( name=data.get('package_name'), ) + ImpactedPackage.objects.create( + vulnerability=vulnerability, + package=package + ) diff --git a/app/vulncode_app/migrations/0001_initial.py b/vulnerabilities/migrations/0001_initial.py similarity index 86% rename from app/vulncode_app/migrations/0001_initial.py rename to vulnerabilities/migrations/0001_initial.py index 2b500623d..43b2635cf 100644 --- a/app/vulncode_app/migrations/0001_initial.py +++ b/vulnerabilities/migrations/0001_initial.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Generated by Django 1.11.4 on 2017-08-08 09:11 +# Generated by Django 1.11.4 on 2017-09-20 22:34 from __future__ import unicode_literals from django.db import migrations, models @@ -37,14 +37,14 @@ class Migration(migrations.Migration): ('platform', models.CharField(blank=True, help_text='Platform eg:maven', max_length=50)), ('name', models.CharField(blank=True, help_text='Package reference name eg:org.apache.commons.io', max_length=50)), ('version', models.CharField(blank=True, help_text='Reference version', max_length=50)), - ('package', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='vulncode_app.Package')), + ('package', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='vulnerabilities.Package')), ], ), migrations.CreateModel( name='ResolvedPackage', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('package', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='vulncode_app.Package')), + ('package', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='vulnerabilities.Package')), ], ), migrations.CreateModel( @@ -59,29 +59,33 @@ class Migration(migrations.Migration): name='VulnerabilityReference', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('source', models.CharField(blank=True, help_text="Source's name eg:NVD", max_length=50)), + ('source', models.CharField(blank=True, help_text='Source(s) name eg:NVD', max_length=50)), ('reference_id', models.CharField(blank=True, help_text='Reference ID, eg:CVE-ID', max_length=50)), ('url', models.URLField(blank=True, help_text='URL of Vulnerability data', max_length=1024)), - ('vulnerability', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='vulncode_app.Vulnerability')), + ('vulnerability', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='vulnerabilities.Vulnerability')), ], ), migrations.AddField( model_name='resolvedpackage', name='vulnerability', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='vulncode_app.Vulnerability'), + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='vulnerabilities.Vulnerability'), ), migrations.AddField( model_name='impactedpackage', name='package', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='vulncode_app.Package'), + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='vulnerabilities.Package'), ), migrations.AddField( model_name='impactedpackage', name='vulnerability', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='vulncode_app.Vulnerability'), + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='vulnerabilities.Vulnerability'), ), migrations.AlterUniqueTogether( name='vulnerabilityreference', - unique_together=set([('vulnerability', 'source', 'reference_id')]), + unique_together=set([('vulnerability', 'source', 'reference_id', 'url')]), + ), + migrations.AlterUniqueTogether( + name='impactedpackage', + unique_together=set([('vulnerability', 'package')]), ), ] diff --git a/vulnerabilities/migrations/0002_package_vulnerabilities.py b/vulnerabilities/migrations/0002_package_vulnerabilities.py new file mode 100644 index 000000000..595b8063e --- /dev/null +++ b/vulnerabilities/migrations/0002_package_vulnerabilities.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.5 on 2017-09-22 19:18 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('vulnerabilities', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='package', + name='vulnerabilities', + field=models.ManyToManyField(through='vulnerabilities.ImpactedPackage', to='vulnerabilities.Vulnerability'), + ), + ] diff --git a/app/vulncode_app/__init__.py b/vulnerabilities/migrations/__init__.py similarity index 100% rename from app/vulncode_app/__init__.py rename to vulnerabilities/migrations/__init__.py diff --git a/app/vulncode_app/models.py b/vulnerabilities/models.py similarity index 94% rename from app/vulncode_app/models.py rename to vulnerabilities/models.py index 713423555..97b0e6dd1 100644 --- a/app/vulncode_app/models.py +++ b/vulnerabilities/models.py @@ -48,7 +48,10 @@ class VulnerabilityReference(models.Model): url = models.URLField(max_length=1024, help_text='URL of Vulnerability data', blank=True) class Meta: - unique_together = ('vulnerability', 'source', 'reference_id') + unique_together = ('vulnerability', 'source', 'reference_id', 'url') + + def __str__(self): + return self.source class ImpactedPackage(models.Model): @@ -58,6 +61,9 @@ class ImpactedPackage(models.Model): vulnerability = models.ForeignKey('Vulnerability') package = models.ForeignKey('Package') + class Meta: + unique_together = ('vulnerability', 'package') + class ResolvedPackage(models.Model): """ @@ -76,6 +82,7 @@ class Package(models.Model): platform = models.CharField(max_length=50, help_text='Package platform eg:maven', blank=True) name = models.CharField(max_length=50, help_text='Package name', blank=True) version = models.CharField(max_length=50, help_text='Package version', blank=True) + vulnerabilities = models.ManyToManyField(to='Vulnerability', through='ImpactedPackage') def __str__(self): return self.name diff --git a/app/scraper/debian.py b/vulnerabilities/scraper/debian.py similarity index 100% rename from app/scraper/debian.py rename to vulnerabilities/scraper/debian.py diff --git a/app/scraper/ubuntu.py b/vulnerabilities/scraper/ubuntu.py similarity index 100% rename from app/scraper/ubuntu.py rename to vulnerabilities/scraper/ubuntu.py diff --git a/vulnerabilities/serializers.py b/vulnerabilities/serializers.py new file mode 100644 index 000000000..ec9a0540c --- /dev/null +++ b/vulnerabilities/serializers.py @@ -0,0 +1,57 @@ +# +# Copyright (c) 2017 nexB Inc. and others. All rights reserved. +# http://nexb.com and https://github.com/nexB/vulnerablecode/ +# The VulnerableCode software is licensed under the Apache License version 2.0. +# Data generated with VulnerableCode require an acknowledgment. +# +# You may not use this software except in compliance with the License. +# You may obtain a copy of the License at: http://apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software distributed +# under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +# CONDITIONS OF ANY KIND, either express or implied. See the License for the +# specific language governing permissions and limitations under the License. +# +# When you publish or redistribute any data created with VulnerableCode or any VulnerableCode +# derivative work, you must accompany this data with the following acknowledgment: +# +# Generated with VulnerableCode and provided on an "AS IS" BASIS, WITHOUT WARRANTIES +# OR CONDITIONS OF ANY KIND, either express or implied. No content created from +# VulnerableCode should be considered or used as legal advice. Consult an Attorney +# for any legal advice. +# VulnerableCode is a free software code scanning tool from nexB Inc. and others. +# Visit https://github.com/nexB/vulnerablecode/ for support and download. + +from rest_framework import serializers + +from vulnerabilities.models import Package +from vulnerabilities.models import PackageReference +from vulnerabilities.models import Vulnerability +from vulnerabilities.models import VulnerabilityReference + + +class PackageReferenceSerializer(serializers.ModelSerializer): + class Meta: + model = PackageReference + fields = ('repository', 'platform', 'name', 'version') + + +class VulnerabilityReferenceSerializer(serializers.ModelSerializer): + class Meta: + model = VulnerabilityReference + fields = ('source', 'reference_id', 'url') + + +class VulnerabilitySerializer(serializers.ModelSerializer): + references = VulnerabilityReferenceSerializer(source='vulnerabilityreference_set', many=True) + + class Meta: + model = Vulnerability + fields = ('summary', 'references') + + +class PackageSerializer(serializers.ModelSerializer): + vulnerabilities = VulnerabilitySerializer(many=True) + + class Meta: + model = Package + fields = ('name', 'version', 'platform', 'vulnerabilities') diff --git a/vulnerabilities/tests/test_api.py b/vulnerabilities/tests/test_api.py new file mode 100644 index 000000000..0c35d3c6b --- /dev/null +++ b/vulnerabilities/tests/test_api.py @@ -0,0 +1,149 @@ +# +# Copyright (c) 2017 nexB Inc. and others. All rights reserved. +# http://nexb.com and https://github.com/nexB/vulnerablecode/ +# The VulnerableCode software is licensed under the Apache License version 2.0. +# Data generated with VulnerableCode require an acknowledgment. +# +# You may not use this software except in compliance with the License. +# You may obtain a copy of the License at: http://apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software distributed +# under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +# CONDITIONS OF ANY KIND, either express or implied. See the License for the +# specific language governing permissions and limitations under the License. +# +# When you publish or redistribute any data created with VulnerableCode or any VulnerableCode +# derivative work, you must accompany this data with the following acknowledgment: +# +# Generated with VulnerableCode and provided on an "AS IS" BASIS, WITHOUT WARRANTIES +# OR CONDITIONS OF ANY KIND, either express or implied. No content created from +# VulnerableCode should be considered or used as legal advice. Consult an Attorney +# for any legal advice. +# VulnerableCode is a free software code scanning tool from nexB Inc. and others. +# Visit https://github.com/nexB/vulnerablecode/ for support and download. + +import json +import os + +from django.test import TestCase + +from vulnerabilities.models import Package +from vulnerabilities.serializers import PackageSerializer +from vulnerabilities.data_dump import debian_dump +from vulnerabilities.data_dump import ubuntu_dump +from vulnerabilities.scraper import debian +from vulnerabilities.scraper import ubuntu + + +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +TEST_DATA = os.path.join(BASE_DIR, 'test_data/') + + +class TestResponse(TestCase): + def test_debian_response(self): + with open(os.path.join(TEST_DATA, 'debian.json')) as f: + test_data = json.loads(f.read()) + + extract_data = debian.extract_vulnerabilities(test_data) + debian_dump(extract_data) + response = self.client.get('/api/mimetex', format='json') + + expected = [{ + "name": "mimetex", + "version": "1.50-1.1", + "platform": "", + "vulnerabilities": [{ + "summary": "Multiple stack-based buffer overflows in mimetex.cgi in mimeTeX", + "references": [{ + "reference_id": "CVE-2009-2458", + "source": "", + "url": "", + }] + }] + }, { + "name": "mimetex", + "version": "1.50-1.1", + "platform": "", + "vulnerabilities": [{ + "summary": "Multiple unspecified vulnerabilities in mimeTeX.", + "references": [{ + "reference_id": "CVE-2009-2459", + "source": "", + "url": "", + }] + }] + }] + + self.assertEqual(expected, response.data) + + def test_ubuntu_response(self): + with open(os.path.join(TEST_DATA, 'ubuntu_main.html')) as f: + test_data = f.read() + + extract_data = ubuntu.extract_cves(test_data) + ubuntu_dump(extract_data) + response = self.client.get('/api/automake', format='json') + + expected = [{ + "name": "automake", + "version": "", + "platform": "", + "vulnerabilities": [{ + "summary": "", + "references": [{ + "reference_id": "CVE-2012-3386", + "source": "", + "url": "", + }] + }] + }] + + self.assertEqual(expected, response.data) + + def test_blank_response(self): + response_invalid = self.client.get('/api/', format='json') + response_blank = self.client.get('/api/abbpcc', format='json') + + self.assertEqual(404, response_invalid.status_code) + self.assertEqual([], response_blank.data) + + +class TestSerializers(TestCase): + def test_serializers(self): + with open(os.path.join(TEST_DATA, 'debian.json')) as f: + test_data = json.loads(f.read()) + extract_data = debian.extract_vulnerabilities(test_data) + debian_dump(extract_data) + + pk = Package.objects.filter(name="mimetex") + response = PackageSerializer(pk, many=True).data + + expected = [ + { + "name": "mimetex", + "version": "1.50-1.1", + "platform": "", + "vulnerabilities": [{ + "summary": "Multiple stack-based buffer overflows in mimetex.cgi in mimeTeX", + "references": [{ + "reference_id": "CVE-2009-2458", + "source": "", + "url": "", + }] + }] + }, + { + "name": "mimetex", + "version": "1.50-1.1", + "platform": "", + "vulnerabilities": [{ + "summary": "Multiple unspecified vulnerabilities in mimeTeX.", + "references": [{ + "reference_id": "CVE-2009-2459", + "source": "", + "url": "", + }] + }] + } + ] + + self.assertEqual(expected, response) diff --git a/app/tests/test_api_data.py b/vulnerabilities/tests/test_api_data.py similarity index 98% rename from app/tests/test_api_data.py rename to vulnerabilities/tests/test_api_data.py index 9f1a4bc54..78d2cee7a 100644 --- a/app/tests/test_api_data.py +++ b/vulnerabilities/tests/test_api_data.py @@ -23,7 +23,7 @@ import json -from vulncode_app.api_data import extract_fields +from vulnerabilities.api_data import extract_fields test_data = """ diff --git a/app/tests/test_data/debian.json b/vulnerabilities/tests/test_data/debian.json similarity index 100% rename from app/tests/test_data/debian.json rename to vulnerabilities/tests/test_data/debian.json diff --git a/app/tests/test_data/ubuntu_main.html b/vulnerabilities/tests/test_data/ubuntu_main.html similarity index 100% rename from app/tests/test_data/ubuntu_main.html rename to vulnerabilities/tests/test_data/ubuntu_main.html diff --git a/app/vulncode_app/test_data_dump.py b/vulnerabilities/tests/test_data_dump.py similarity index 84% rename from app/vulncode_app/test_data_dump.py rename to vulnerabilities/tests/test_data_dump.py index cb359ece4..d796a50d3 100644 --- a/app/vulncode_app/test_data_dump.py +++ b/vulnerabilities/tests/test_data_dump.py @@ -22,16 +22,21 @@ # Visit https://github.com/nexB/vulnerablecode/ for support and download. import json +import os from django.test import TestCase -from vulncode_app.models import Vulnerability -from vulncode_app.models import VulnerabilityReference -from vulncode_app.models import Package -from vulncode_app.data_dump import debian_dump -from vulncode_app.data_dump import ubuntu_dump -from scraper import debian -from scraper import ubuntu +from vulnerabilities.models import Vulnerability +from vulnerabilities.models import VulnerabilityReference +from vulnerabilities.models import Package +from vulnerabilities.data_dump import debian_dump +from vulnerabilities.data_dump import ubuntu_dump +from vulnerabilities.scraper import debian +from vulnerabilities.scraper import ubuntu + + +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +TEST_DATA = os.path.join(BASE_DIR, 'test_data/') class TestDataDump(TestCase): @@ -40,7 +45,7 @@ def test_debian_data_dump(self): Scrape data from Debian' main tracker, save it in the database and verify entries. """ - with open('tests/test_data/debian.json') as f: + with open(os.path.join(TEST_DATA, 'debian.json')) as f: test_data = json.loads(f.read()) extract_data = debian.extract_vulnerabilities(test_data) @@ -71,7 +76,7 @@ def test_ubuntu_data_dump(self): Scrape data from Ubuntu' main tracker, save it in the database and verify entries. """ - with open('tests/test_data/ubuntu_main.html') as f: + with open(os.path.join(TEST_DATA, 'ubuntu_main.html')) as f: test_data = f.read() data = ubuntu.extract_cves(test_data) diff --git a/app/vulncode_app/test_models.py b/vulnerabilities/tests/test_models.py similarity index 94% rename from app/vulncode_app/test_models.py rename to vulnerabilities/tests/test_models.py index 2f5fe0cac..69581c2a7 100644 --- a/app/vulncode_app/test_models.py +++ b/vulnerabilities/tests/test_models.py @@ -23,10 +23,10 @@ from django.test import TestCase -from vulncode_app.models import Vulnerability -from vulncode_app.models import VulnerabilityReference -from vulncode_app.models import Package -from vulncode_app.models import PackageReference +from vulnerabilities.models import Vulnerability +from vulnerabilities.models import VulnerabilityReference +from vulnerabilities.models import Package +from vulnerabilities.models import PackageReference class TestVulnerability(TestCase): diff --git a/app/tests/test_scrapers.py b/vulnerabilities/tests/test_scrapers.py similarity index 97% rename from app/tests/test_scrapers.py rename to vulnerabilities/tests/test_scrapers.py index 13cf4e96b..49f669909 100644 --- a/app/tests/test_scrapers.py +++ b/vulnerabilities/tests/test_scrapers.py @@ -25,8 +25,8 @@ from os.path import dirname from os.path import join -from scraper import debian -from scraper import ubuntu +from vulnerabilities.scraper import debian +from vulnerabilities.scraper import ubuntu def test_ubuntu_extract_cves(): diff --git a/app/vulncode_app/urls.py b/vulnerabilities/urls.py similarity index 76% rename from app/vulncode_app/urls.py rename to vulnerabilities/urls.py index 6eec081f6..5f90c3579 100644 --- a/app/vulncode_app/urls.py +++ b/vulnerabilities/urls.py @@ -23,10 +23,20 @@ from django.conf.urls import url -from . import views +from rest_framework.urlpatterns import format_suffix_patterns + +from vulnerabilities import views urlpatterns = [ - url(r'(?P[a-z]+)/(?P[0-9]+)', views.package_version, name='package_version'), - url(r'^(?P[a-z]+)', views.package, name='package'), + url(r'^cve-search/(?P[a-z]+)/(?P[0-9]+)', + views.package_version, + name='package_version'), + url(r'^cve-search/(?P[a-z]+)', + views.package, + name='package'), + url(r'^api/(?P.+)', + views.VulnerabilityData.as_view()), ] + +urlpatterns = format_suffix_patterns(urlpatterns) diff --git a/app/vulncode_app/views.py b/vulnerabilities/views.py similarity index 82% rename from app/vulncode_app/views.py rename to vulnerabilities/views.py index 254b8b311..14b561ede 100644 --- a/app/vulncode_app/views.py +++ b/vulnerabilities/views.py @@ -25,7 +25,19 @@ from django.http import HttpResponse -from vulncode_app import api_data +from rest_framework.views import APIView +from rest_framework.response import Response + +from vulnerabilities.models import Package +from vulnerabilities.serializers import PackageSerializer +from vulnerabilities import api_data + + +class VulnerabilityData(APIView): + def get(self, request, package_name): + package = Package.objects.filter(name=package_name) + response = PackageSerializer(package, many=True).data + return Response(response) def package(request, name): diff --git a/app/vulncode_app/migrations/__init__.py b/vulnerablecode/__init__.py similarity index 100% rename from app/vulncode_app/migrations/__init__.py rename to vulnerablecode/__init__.py diff --git a/app/app/settings.py b/vulnerablecode/settings.py similarity index 95% rename from app/app/settings.py rename to vulnerablecode/settings.py index 157066daa..d541733c0 100644 --- a/app/app/settings.py +++ b/vulnerablecode/settings.py @@ -31,13 +31,14 @@ # Application definition INSTALLED_APPS = [ - 'vulncode_app.apps.VulncodeAppConfig', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', + 'vulnerabilities', + 'rest_framework', ] MIDDLEWARE = [ @@ -50,7 +51,7 @@ 'django.middleware.clickjacking.XFrameOptionsMiddleware', ] -ROOT_URLCONF = 'app.urls' +ROOT_URLCONF = 'vulnerabilities.urls' TEMPLATES = [ { @@ -68,7 +69,7 @@ }, ] -WSGI_APPLICATION = 'app.wsgi.application' +WSGI_APPLICATION = 'vulnerablecode.wsgi.application' # Database diff --git a/app/app/urls.py b/vulnerablecode/urls.py similarity index 91% rename from app/app/urls.py rename to vulnerablecode/urls.py index 37fd405a7..0c4e0501c 100644 --- a/app/app/urls.py +++ b/vulnerablecode/urls.py @@ -17,5 +17,5 @@ from django.conf.urls import url, include urlpatterns = [ - url(r'^vulncode_app/', include('vulncode_app.urls')), + url(r'^vulnerabilities/', include('vulnerabilities.urls')), ] diff --git a/app/app/wsgi.py b/vulnerablecode/wsgi.py similarity index 81% rename from app/app/wsgi.py rename to vulnerablecode/wsgi.py index cefd1ede9..2ac78d339 100644 --- a/app/app/wsgi.py +++ b/vulnerablecode/wsgi.py @@ -11,6 +11,6 @@ from django.core.wsgi import get_wsgi_application -os.environ.setdefault("DJANGO_SETTINGS_MODULE", "app.settings") +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "vunerablecode.settings") application = get_wsgi_application()