Skip to content

Commit 780d52b

Browse files
author
Diego Nadares
committed
Merge branch 'refs/heads/white/dev' into white/staging
2 parents 0870475 + 5cfcc7c commit 780d52b

File tree

7 files changed

+85
-3
lines changed

7 files changed

+85
-3
lines changed

faraday/server/api/modules/hosts_context.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,8 @@ def _generate_filter_query(
146146
joinedload(self.model_class.update_user),
147147
joinedload(getattr(self.model_class, 'creator')).load_only('username'),
148148
)
149-
filter_query = self._apply_filter_context(filter_query)
149+
filter_query = (self._apply_filter_context(filter_query).
150+
filter(Host.workspace.has(active=True))) # only hosts from active workspaces
150151
return filter_query
151152

152153
@route('/<host_id>/services')

faraday/server/api/modules/services_context.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@
99
from filteralchemy import FilterSet, operators # pylint:disable=unused-import
1010
# Local application imports
1111
from faraday.server.models import (
12-
Service
12+
Service,
13+
db,
1314
)
1415
from faraday.server.api.base import (
1516
FilterMixin,
@@ -21,6 +22,8 @@
2122
PaginatedMixin
2223
)
2324
from faraday.server.api.modules.services import ServiceSchema
25+
from faraday.server.utils.search import search
26+
2427
services_context_api = Blueprint('services_context_api', __name__)
2528

2629

@@ -56,5 +59,16 @@ def _envelope_list(self, objects, pagination_metadata=None):
5659
if pagination_metadata is not None else len(services))
5760
}
5861

62+
def _generate_filter_query(
63+
self, filters, severity_count=False, host_vulns=False, only_total_vulns=False, list_view=False
64+
):
65+
filter_query = search(db.session,
66+
self.model_class,
67+
filters)
68+
69+
filter_query = (self._apply_filter_context(filter_query).
70+
filter(Service.workspace.has(active=True))) # only services from active workspaces
71+
return filter_query
72+
5973

6074
ServiceContextView.register(services_context_api)

faraday/server/api/modules/vulns.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1493,7 +1493,6 @@ def _post_bulk_update(self, ids, extracted_data, workspace_name, **kwargs):
14931493
if 'returning' in kwargs and kwargs['returning']:
14941494
# update host stats
14951495
from faraday.server.tasks import update_host_stats # pylint:disable=import-outside-toplevel
1496-
print(kwargs['returning'])
14971496
host_id_list = [data[4] for data in kwargs['returning'] if data[4]]
14981497
service_id_list = [data[5] for data in kwargs['returning'] if data[5]]
14991498
if faraday_server.celery_enabled:

faraday/server/api/modules/vulns_context.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -412,6 +412,8 @@ def _generate_filter_query(self, vulnerability_class, filters, hostname_filters,
412412
filters)
413413
vulns = self._apply_filter_context(vulns)
414414

415+
vulns = vulns.filter(vulnerability_class.workspace.has(active=True))
416+
415417
if hosts_os_filter:
416418
os_value = hosts_os_filter['val']
417419
vulns = vulns.join(Host).join(Service).filter(Host.os == os_value)

tests/test_api_hosts_context.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,24 @@ def test_list_retrieves_all_items_from_all_workspace(self, test_client,
9494
assert res.status_code == 200
9595
assert len(res.json['rows']) == HOSTS_COUNT + 1
9696

97+
@pytest.mark.usefixtures('ignore_nplusone')
98+
def test_list_retrieves_all_items_from_only_active_workspace(self, test_client,
99+
second_workspace,
100+
session,
101+
host_factory):
102+
host_factory.create(workspace=second_workspace)
103+
session.commit()
104+
res = test_client.get(f"{self.url()}/filter")
105+
assert res.status_code == 200
106+
assert len(res.json['rows']) == HOSTS_COUNT + 1
107+
108+
second_workspace.active = False
109+
session.commit()
110+
111+
res = test_client.get(f"{self.url()}/filter")
112+
assert res.status_code == 200
113+
assert len(res.json['rows']) == HOSTS_COUNT
114+
97115
def test_retrieve_one_host(self, test_client, database):
98116
host = self.workspace.hosts[0]
99117
assert host.id is not None

tests/test_api_services_context.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,21 @@ def test_list_retrieves_all_items_from(self, test_client, logged_user):
8484
assert res.status_code == 200
8585
assert len(res.json['services']) == OBJECT_COUNT
8686

87+
@pytest.mark.usefixtures('ignore_nplusone')
88+
def test_list_retrieves_items_from_active_workspaces(self, test_client, logged_user, session, second_workspace,
89+
service_factory):
90+
service_factory.create(workspace=second_workspace)
91+
session.commit()
92+
res = test_client.get(f"{self.url()}/filter")
93+
assert res.status_code == 200
94+
assert len(res.json['services']) == OBJECT_COUNT + 1
95+
96+
second_workspace.active = False
97+
session.commit()
98+
res = test_client.get(f"{self.url()}/filter")
99+
assert res.status_code == 200
100+
assert len(res.json['services']) == OBJECT_COUNT
101+
87102
def test_bulk_delete_with_references(self, test_client, session, workspace):
88103
service_1 = self.factory.create(workspace=workspace)
89104
service_2 = self.factory.create(workspace=workspace)

tests/test_api_vulnerability_context.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -327,6 +327,39 @@ def test_hostnames(self, host_with_hostnames, test_client, session,
327327
assert set(res.json['hostnames']) == {hostname.name for hostname in
328328
host_with_hostnames.hostnames}
329329

330+
def test_wont_get_vulns_from_inactive_workspace(self, vulnerability_factory, second_workspace, test_client, session):
331+
vulns = VulnerabilityWeb.query.all()
332+
for vuln in vulns:
333+
session.delete(vuln)
334+
session.commit()
335+
336+
vulns = Vulnerability.query.all()
337+
for vuln in vulns:
338+
session.delete(vuln)
339+
session.commit()
340+
341+
vulns_unconfirmed = vulnerability_factory.create_batch(4, confirmed=False,
342+
workspace=self.workspace,
343+
status='open',
344+
severity='critical')
345+
346+
vulns_high = vulnerability_factory.create_batch(4,
347+
confirmed=True,
348+
workspace=second_workspace,
349+
status='open',
350+
severity='high')
351+
session.add_all(vulns_unconfirmed + vulns_high)
352+
session.commit()
353+
354+
response = test_client.get(f'{self.url()}/filter')
355+
assert response.status_code == 200
356+
assert response.json['count'] == 8
357+
358+
second_workspace.active = False
359+
response = test_client.get(f'{self.url()}/filter')
360+
assert response.status_code == 200
361+
assert response.json['count'] == 4
362+
330363
def test_histogram_creation(self, vulnerability_factory, second_workspace, test_client, session):
331364
"""
332365
This one should only check basic vuln properties

0 commit comments

Comments
 (0)