Skip to content

Commit 0ce5b86

Browse files
committed
progress
1 parent 90f118a commit 0ce5b86

File tree

3 files changed

+127
-39
lines changed

3 files changed

+127
-39
lines changed

application/cmd/cre_main.py

Lines changed: 39 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ def add_from_spreadsheet(spreadsheet_url: str, cache_loc: str, cre_loc: str) ->
225225
import new mappings from <url>
226226
export db to ../../cres/
227227
"""
228-
database = db_connect(path=cache_loc)
228+
database, _, _ = db_connect(path=cache_loc)
229229
spreadsheet = sheet_utils.readSpreadsheet(
230230
url=spreadsheet_url, cres_loc=cre_loc, alias="new spreadsheet", validate=False
231231
)
@@ -245,7 +245,7 @@ def add_from_disk(cache_loc: str, cre_loc: str) -> None:
245245
import new mappings from <path>
246246
export db to ../../cres/
247247
"""
248-
database = db_connect(path=cache_loc)
248+
database, _, _ = db_connect(path=cache_loc)
249249
for file in get_cre_files_from_disk(cre_loc):
250250
with open(file, "rb") as standard:
251251
parse_file(
@@ -264,7 +264,7 @@ def review_from_spreadsheet(cache: str, spreadsheet_url: str, share_with: str) -
264264
create new spreadsheet of the new CRE landscape for review
265265
"""
266266
loc, cache = prepare_for_review(cache)
267-
database = db_connect(path=cache)
267+
database, _, _ = db_connect(path=cache)
268268
spreadsheet = sheet_utils.readSpreadsheet(
269269
url=spreadsheet_url, cres_loc=loc, alias="new spreadsheet", validate=False
270270
)
@@ -293,7 +293,7 @@ def review_from_disk(cache: str, cre_file_loc: str, share_with: str) -> None:
293293
create new spreadsheet of the new CRE landscape for review
294294
"""
295295
loc, cache = prepare_for_review(cache)
296-
database = db_connect(path=cache)
296+
database, _, _ = db_connect(path=cache)
297297
for file in get_cre_files_from_disk(cre_file_loc):
298298
with open(file, "rb") as standard:
299299
parse_file(
@@ -358,31 +358,33 @@ def run(args: argparse.Namespace) -> None: # pragma: no cover
358358
elif args.osib_out:
359359
export_to_osib(file_loc=args.osib_out, cache=args.cache_file)
360360
if args.zap_in:
361-
zap_alerts_parser.parse_zap_alerts(db_connect(args.cache_file))
361+
cache, _, _ = db_connect(args.cache_file)
362+
zap_alerts_parser.parse_zap_alerts(cache)
362363
if args.cheatsheets_in:
363-
cheatsheets_parser.parse_cheatsheets(db_connect(args.cache_file))
364+
cache, _, _ = db_connect(args.cache_file)
365+
cheatsheets_parser.parse_cheatsheets(cache)
364366
if args.github_tools_in:
365367
for url in misc_tools_parser.tool_urls:
366-
misc_tools_parser.parse_tool(
367-
cache=db_connect(args.cache_file), tool_repo=url
368-
)
368+
cache, _, _ = db_connect(args.cache_file)
369+
misc_tools_parser.parse_tool(cache=cache, tool_repo=url)
369370
if args.owasp_proj_meta:
370371
owasp_metadata_to_cre(args.owasp_proj_meta)
371372

372373
if args.compare_datasets:
373-
compare_datasets(args.dataset1, args.dataset2)
374+
d1, d2, ed1, ed2 = compare_datasets(args.dataset1, args.dataset2)
375+
if len(d1) or len(d2) or len(ed1) or len(ed2):
376+
exit(1)
374377

375378

376-
def db_connect(path: str) -> db.Node_collection:
379+
def db_connect(path: str) -> Tuple[db.Node_collection, Any, Any]:
377380

378381
global app
379382
conf = CMDConfig(db_uri=path)
380383
app = create_app(conf=conf)
381384
collection = db.Node_collection()
382385
app_context = app.app_context()
383386
app_context.push()
384-
385-
return collection
387+
return (collection, app, app_context)
386388

387389

388390
def create_spreadsheet(
@@ -416,7 +418,7 @@ def review_osib_from_file(file_loc: str, cache: str, cre_loc: str) -> None:
416418
"""Given the location of an osib.yaml, parse osib, convert to cres and add to db
417419
export db to yamls and spreadsheet for review"""
418420
loc, cache = prepare_for_review(cache)
419-
database = db_connect(path=cache)
421+
database, _, _ = db_connect(path=cache)
420422
ymls = odefs.read_osib_yaml(file_loc)
421423
osibs = odefs.try_from_file(ymls)
422424
for osib in osibs:
@@ -437,7 +439,7 @@ def review_osib_from_file(file_loc: str, cache: str, cre_loc: str) -> None:
437439

438440

439441
def add_osib_from_file(file_loc: str, cache: str, cre_loc: str) -> None:
440-
database = db_connect(path=cache)
442+
database, _, _ = db_connect(path=cache)
441443
ymls = odefs.read_osib_yaml(file_loc)
442444
osibs = odefs.try_from_file(ymls)
443445
for osib in osibs:
@@ -448,7 +450,8 @@ def add_osib_from_file(file_loc: str, cache: str, cre_loc: str) -> None:
448450

449451

450452
def export_to_osib(file_loc: str, cache: str) -> None:
451-
docs = db_connect(path=cache).export(file_loc, dry_run=True)
453+
cache, _, _ = db_connect(path=cache)
454+
docs = cache.export(file_loc, dry_run=True)
452455
tree = odefs.cre2osib(docs)
453456
with open(file_loc, "x"):
454457
with open(file_loc, "w") as f:
@@ -464,26 +467,23 @@ def compare_datasets(db1: str, db2: str) -> List[Dict]:
464467
ensure that both graphs have same number of nodes and edges and both graphs have the same data
465468
"""
466469

467-
database1 = db_connect(path=db1)
468-
database2 = db_connect(path=db2)
469-
470470
def make_hashtable(graph):
471471
nodes = {}
472472
edges = {}
473473
for node in graph.nodes():
474474
if node.startswith("CRE"):
475-
nodes[graph.nodes[node]["external_id"]] = node
475+
nodes[graph.nodes[node].get("external_id")] = node
476476
elif node.startswith("Node"):
477-
nodes[graph.nodes[node]["infosum"]] = node
477+
nodes[graph.nodes[node].get("infosum")] = node
478478
else:
479479
logger.fatal("Graph seems corrupted")
480480

481481
for edge in graph.edges():
482-
key = graph.nodes[edge[0]]["external_id"]
482+
key = graph.nodes[edge[0]].get("external_id")
483483
if edge[1].startswith("CRE"):
484-
key = key + "-" + graph.nodes[edge[1]]["external_id"]
484+
key = f"{key}-{graph.nodes[edge[1]].get('external_id')}"
485485
else:
486-
key = key + "-" + graph.nodes[edge[1]]["infosum"]
486+
key = f"{key}-{graph.nodes[edge[1]].get('infosum')}"
487487
edges[key] = edge
488488
return nodes, edges
489489

@@ -524,19 +524,30 @@ def edge_differences(edges1, edges2, db2):
524524
}
525525
return differences
526526

527+
database1, _, _ = db_connect(path=db1)
527528
g1 = database1.graph.graph
528-
g2 = database2.graph.graph
529529
n1, e1 = make_hashtable(g1)
530+
531+
print("$" * 90)
532+
database1.graph.print_graph()
533+
print("$" * 90)
534+
database1.graph._instance = None
535+
database1.graph = None
536+
537+
database2, _, _ = db_connect(path=db2)
538+
g2 = database2.graph.graph
539+
print("$" * 90)
540+
database2.graph.print_graph()
541+
print("$" * 90)
542+
input()
530543
n2, e2 = make_hashtable(g2)
531544

532545
d1 = node_differences(n1, n2, db2)
533546
d2 = node_differences(n2, n1, db1)
534547

535548
ed1 = edge_differences(e1, e2, db2)
536549
ed2 = edge_differences(e2, e1, db1)
537-
if len(d1) or len(d2) or len(ed1) or len(ed2):
538-
exit(1)
539-
# return [d1, d2, ed1, ed2] # TODO uncomment when this becomes a library method
550+
return [d1, d2, ed1, ed2] # TODO uncomment when this becomes a library method
540551

541552

542553
def owasp_metadata_to_cre(meta_file: str):

application/database/db.py

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
from sqlalchemy import func
1414
from sqlalchemy.sql.expression import desc # type: ignore
1515
import uuid
16+
from matplotlib import pyplot
1617

1718
from .. import sqla # type: ignore
1819

@@ -140,6 +141,15 @@ class CRE_Graph:
140141
graph: nx.Graph = None
141142
__instance = None
142143

144+
def print_graph(self, png_path: str = None):
145+
"""DEbug method to dump the graph, if png_path is provided it shows the graph in png format
146+
if not, it returns the graph as dict of dicts"""
147+
if png_path:
148+
nx.draw(self.graph, with_labels=True)
149+
pyplot.savefig(png_path)
150+
pyplot.show()
151+
return nx.to_dict_of_dicts(self.graph)
152+
143153
@classmethod
144154
def instance(cls, session):
145155
if cls.__instance is None:
@@ -219,12 +229,11 @@ def load_cre_graph(cls, session) -> nx.Graph:
219229

220230
class Node_collection:
221231
graph: nx.Graph = None
222-
session = sqla.session
232+
session = None
223233

224-
def __init__(self) -> None:
234+
def __init__(self, session=sqla.session) -> None:
225235
self.graph = CRE_Graph.instance(sqla.session)
226-
# self.graph = CRE_Graph.instance(session=sqla.session)
227-
self.session = sqla.session
236+
self.session = session
228237

229238
def __get_external_links(self) -> List[Tuple[CRE, Node, str]]:
230239
external_links: List[Tuple[CRE, Node, str]] = []

application/tests/cre_main_test.py

Lines changed: 75 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import copy
12
import logging
23
import os
34
import shutil
@@ -372,7 +373,7 @@ def test_add_from_spreadsheet(
372373
self.tmpdirs.append(dir)
373374
cache = tempfile.mkstemp(dir=dir, suffix=".sqlite")[1]
374375

375-
mocked_db_connect.return_value = self.collection
376+
mocked_db_connect.return_value = self.collection, self.app, self.app_context
376377
mocked_export.return_value = [
377378
defs.CRE(name="c0"),
378379
defs.Standard(name="s0", section="s1"),
@@ -415,7 +416,7 @@ def test_review_from_spreadsheet(
415416
loc = tempfile.mkstemp(dir=dir)[1]
416417
cache = tempfile.mkstemp(dir=dir)[1]
417418
mocked_prepare_for_review.return_value = (loc, cache)
418-
mocked_db_connect.return_value = self.collection
419+
mocked_db_connect.return_value = self.collection, self.app, self.app_context
419420

420421
mocked_create_spreadsheet.return_value = "https://example.com/sheeet"
421422
mocked_export.return_value = [
@@ -467,7 +468,7 @@ def test_review_from_disk(
467468
loc = tempfile.mkstemp(dir=dir)[1]
468469
cache = tempfile.mkstemp(dir=dir, suffix=".sqlite")[1]
469470
mocked_prepare_for_review.return_value = (loc, cache)
470-
mocked_db_connect.return_value = self.collection
471+
mocked_db_connect.return_value = self.collection, self.app, self.app_context
471472
mocked_get_standards_files_from_disk.return_value = [yml for i in range(0, 3)]
472473
mocked_export.return_value = [
473474
defs.CRE(name="c0"),
@@ -511,7 +512,7 @@ def test_add_from_disk(
511512
yml = tempfile.mkstemp(dir=dir, suffix=".yaml")[1]
512513
loc = tempfile.mkstemp(dir=dir)[1]
513514
cache = tempfile.mkstemp(dir=dir, suffix=".sqlite")[1]
514-
mocked_db_connect.return_value = self.collection
515+
mocked_db_connect.return_value = self.collection, self.app, self.app_context
515516
mocked_get_standards_files_from_disk.return_value = [yml for i in range(0, 3)]
516517
mocked_export.return_value = [
517518
defs.CRE(name="c0"),
@@ -557,7 +558,7 @@ def test_review_osib_from_file(
557558
loc = tempfile.mkstemp(dir=dir)[1]
558559
cach = tempfile.mkstemp(dir=dir)[1]
559560
mocked_prepare_for_review.return_value = (loc, cach)
560-
mocked_db_connect.return_value = self.collection
561+
mocked_db_connect.return_value = self.collection, self.app, self.app_context
561562
mocked_read_osib_yaml.return_value = [{"osib": "osib"}]
562563
mocked_try_from_file.return_value = [
563564
Osib_tree(aliases=[Osib_id("t1")]),
@@ -619,7 +620,7 @@ def test_add_osib_from_file(
619620
osib_yaml = tempfile.mkstemp(dir=dir, suffix=".yaml")[1]
620621
loc = tempfile.mkstemp(dir=dir)[1]
621622
cache = tempfile.mkstemp(dir=dir, suffix=".sqlite")[1]
622-
mocked_db_connect.return_value = self.collection
623+
mocked_db_connect.return_value = self.collection, self.app, self.app_context
623624
mocked_read_osib_yaml.return_value = [{"osib": "osib"}]
624625
mocked_try_from_file.return_value = [
625626
odefs.Osib_tree(aliases=[Osib_id("t1")]),
@@ -663,14 +664,81 @@ def test_export_to_osib(
663664
# osib_yaml = tempfile.mkstemp(dir=dir,suffix=".yaml")[1]
664665
loc = tempfile.mkstemp(dir=dir)[1]
665666
cache = tempfile.mkstemp(dir=dir, suffix=".sqlite")[1]
666-
mocked_db_connect.return_value = self.collection
667+
mocked_db_connect.return_value = self.collection, self.app, self.app_context
667668
mocked_cre2osib.return_value = odefs.Osib_tree(aliases=[Osib_id("t1")])
668669
mocked_export.return_value = [defs.CRE(name="c0")]
669670

670671
main.export_to_osib(file_loc=f"{dir}/osib.yaml", cache=cache)
671672
mocked_db_connect.assert_called_with(path=cache)
672673
mocked_cre2osib.assert_called_with([defs.CRE(name="c0")])
673674

675+
def test_compare_datasets(self):
676+
_, t1 = tempfile.mkstemp()
677+
_, t2 = tempfile.mkstemp()
678+
_, tdiff = tempfile.mkstemp()
679+
self.tmpdirs.extend([t1, t2, tdiff])
680+
681+
c0 = defs.CRE(id="111-000", description="CREdesc", name="CREname")
682+
s456 = defs.Standard(
683+
subsection="4.5.6",
684+
section="FooStand",
685+
name="BarStand",
686+
hyperlink="https://example.com",
687+
tags=["a", "b", "c"],
688+
)
689+
c1 = defs.CRE(
690+
id="111-001",
691+
description="Groupdesc",
692+
name="GroupName",
693+
links=[defs.Link(document=s456)],
694+
)
695+
s_unlinked = defs.Standard(
696+
subsection="4.5.6",
697+
section="Unlinked",
698+
name="Unlinked",
699+
hyperlink="https://example.com",
700+
)
701+
connection_1, app1, context1 = main.db_connect(path=t1)
702+
sqla.create_all(app=app1)
703+
connection_1.graph.graph = db.CRE_Graph.load_cre_graph(connection_1.session)
704+
connection_1.add_cre(c0)
705+
connection_1.add_node(s_unlinked)
706+
connection_1.add_link(connection_1.add_cre(c1), connection_1.add_node(s456))
707+
708+
pprint("%" * 90)
709+
pprint(t1)
710+
pprint(connection_1.graph.print_graph())
711+
input()
712+
713+
# connection_2,app2,context2 = main.db_connect(path=t2)
714+
# sqla.create_all(app=app2)
715+
# connection_2.graph.graph = db.CRE_Graph.load_cre_graph(sqla.session)
716+
# connection_2.add_cre(c0)
717+
# connection_2.add_node(s_unlinked)
718+
# connection_2.add_link(connection_2.add_cre(c1),connection_2.add_node(s456))
719+
720+
connection_diff, appdiff, contextdiff = main.db_connect(path=tdiff)
721+
connection_diff.graph.graph = db.CRE_Graph.load_cre_graph(
722+
connection_diff.session
723+
)
724+
sqla.create_all(app=appdiff)
725+
connection_diff.add_cre(c0)
726+
connection_diff.add_cre(defs.CRE(id="000-111", name="asdfa232332sdf"))
727+
728+
pprint("#" * 90)
729+
pprint(tdiff)
730+
pprint(connection_diff.graph.print_graph())
731+
input()
732+
pprint("#" * 90)
733+
734+
# self.assertEqual(main.compare_datasets("foo", "bar"), [{},{},{},{}])
735+
# self.assertEqual(main.compare_datasets(t1,t2), [{},{},{},{}])
736+
self.assertNotEqual(main.compare_datasets(t1, tdiff), [{}, {}, {}, {}])
737+
738+
contextdiff.pop()
739+
# context2.pop()
740+
context1.pop()
741+
674742
# def test_prepare_for_Review(self):
675743
# raise NotImplementedError
676744

0 commit comments

Comments
 (0)