synapse 2.180.0__py311-none-any.whl → 2.181.0__py311-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of synapse might be problematic. Click here for more details.

Files changed (88) hide show
  1. synapse/assets/__init__.py +35 -0
  2. synapse/assets/storm/migrations/model-0.2.28.storm +355 -0
  3. synapse/common.py +2 -1
  4. synapse/cortex.py +49 -35
  5. synapse/cryotank.py +1 -1
  6. synapse/datamodel.py +30 -0
  7. synapse/lib/ast.py +12 -7
  8. synapse/lib/cell.py +1 -1
  9. synapse/lib/certdir.py +4 -4
  10. synapse/lib/chop.py +0 -1
  11. synapse/lib/drive.py +8 -8
  12. synapse/lib/layer.py +55 -13
  13. synapse/lib/lmdbslab.py +26 -5
  14. synapse/lib/modelrev.py +28 -1
  15. synapse/lib/modules.py +1 -0
  16. synapse/lib/nexus.py +1 -1
  17. synapse/lib/node.py +5 -0
  18. synapse/lib/parser.py +23 -16
  19. synapse/lib/scrape.py +1 -1
  20. synapse/lib/slabseqn.py +2 -2
  21. synapse/lib/snap.py +129 -0
  22. synapse/lib/storm.lark +16 -2
  23. synapse/lib/storm.py +3 -0
  24. synapse/lib/storm_format.py +1 -0
  25. synapse/lib/stormhttp.py +34 -1
  26. synapse/lib/stormlib/auth.py +1 -1
  27. synapse/lib/stormlib/cortex.py +5 -2
  28. synapse/lib/stormlib/ipv6.py +2 -2
  29. synapse/lib/stormlib/model.py +114 -12
  30. synapse/lib/stormlib/project.py +1 -1
  31. synapse/lib/stormtypes.py +81 -7
  32. synapse/lib/types.py +7 -0
  33. synapse/lib/version.py +2 -2
  34. synapse/lib/view.py +47 -0
  35. synapse/models/inet.py +10 -3
  36. synapse/models/infotech.py +2 -1
  37. synapse/models/language.py +4 -0
  38. synapse/models/math.py +50 -0
  39. synapse/models/orgs.py +8 -0
  40. synapse/models/risk.py +9 -0
  41. synapse/tests/files/stormcov/pragma-nocov.storm +18 -0
  42. synapse/tests/test_assets.py +25 -0
  43. synapse/tests/test_cortex.py +129 -0
  44. synapse/tests/test_datamodel.py +6 -0
  45. synapse/tests/test_lib_aha.py +2 -1
  46. synapse/tests/test_lib_certdir.py +9 -0
  47. synapse/tests/test_lib_grammar.py +7 -1
  48. synapse/tests/test_lib_layer.py +35 -0
  49. synapse/tests/test_lib_lmdbslab.py +11 -9
  50. synapse/tests/test_lib_modelrev.py +655 -1
  51. synapse/tests/test_lib_slabseqn.py +5 -4
  52. synapse/tests/test_lib_snap.py +4 -0
  53. synapse/tests/test_lib_storm.py +72 -1
  54. synapse/tests/test_lib_stormhttp.py +99 -1
  55. synapse/tests/test_lib_stormlib_cortex.py +21 -4
  56. synapse/tests/test_lib_stormlib_iters.py +8 -5
  57. synapse/tests/test_lib_stormlib_model.py +45 -6
  58. synapse/tests/test_lib_stormtypes.py +158 -2
  59. synapse/tests/test_lib_types.py +6 -0
  60. synapse/tests/test_model_inet.py +10 -0
  61. synapse/tests/test_model_language.py +4 -0
  62. synapse/tests/test_model_math.py +22 -0
  63. synapse/tests/test_model_orgs.py +6 -2
  64. synapse/tests/test_model_risk.py +4 -0
  65. synapse/tests/test_utils_stormcov.py +5 -0
  66. synapse/tests/utils.py +18 -5
  67. synapse/utils/stormcov/plugin.py +31 -1
  68. synapse/vendor/cpython/LICENSE +279 -0
  69. synapse/vendor/cpython/__init__.py +0 -0
  70. synapse/vendor/cpython/lib/__init__.py +0 -0
  71. synapse/vendor/cpython/lib/email/__init__.py +0 -0
  72. synapse/vendor/cpython/lib/email/_parseaddr.py +560 -0
  73. synapse/vendor/cpython/lib/email/utils.py +505 -0
  74. synapse/vendor/cpython/lib/ipaddress.py +2366 -0
  75. synapse/vendor/cpython/lib/test/__init__.py +0 -0
  76. synapse/vendor/cpython/lib/test/support/__init__.py +114 -0
  77. synapse/vendor/cpython/lib/test/test_email/__init__.py +0 -0
  78. synapse/vendor/cpython/lib/test/test_email/test_email.py +480 -0
  79. synapse/vendor/cpython/lib/test/test_email/test_utils.py +167 -0
  80. synapse/vendor/cpython/lib/test/test_ipaddress.py +2672 -0
  81. synapse/vendor/utils.py +4 -3
  82. {synapse-2.180.0.dist-info → synapse-2.181.0.dist-info}/METADATA +2 -2
  83. {synapse-2.180.0.dist-info → synapse-2.181.0.dist-info}/RECORD +86 -69
  84. {synapse-2.180.0.dist-info → synapse-2.181.0.dist-info}/WHEEL +1 -1
  85. synapse/lib/jupyter.py +0 -505
  86. synapse/tests/test_lib_jupyter.py +0 -224
  87. {synapse-2.180.0.dist-info → synapse-2.181.0.dist-info}/LICENSE +0 -0
  88. {synapse-2.180.0.dist-info → synapse-2.181.0.dist-info}/top_level.txt +0 -0
@@ -1,4 +1,7 @@
1
+ import datetime
2
+
1
3
  import synapse.exc as s_exc
4
+ import synapse.common as s_common
2
5
 
3
6
  import synapse.lib.chop as s_chop
4
7
  import synapse.lib.modelrev as s_modelrev
@@ -561,8 +564,659 @@ class ModelRevTest(s_tests.SynTest):
561
564
  self.eq([node.ndef[0] for node in nodes], [node.ndef[0] for node in reversed(rnodes)])
562
565
 
563
566
  async def test_modelrev_0_2_27(self):
564
-
565
567
  async with self.getRegrCore('model-0.2.27') as core:
566
568
  nodes = await core.nodes('it:dev:repo:commit:id=" Foo "')
567
569
  self.len(1, nodes)
568
570
  self.eq('Foo', nodes[0].get('id'))
571
+
572
+ async def test_modelrev_cpe(self):
573
+ # Skip this test for now since 0_2_28 migration was disabled. This test will be moved/updated in a later PR.
574
+ self.skip('Model 0.2.28 disabled')
575
+
576
+ async with self.getRegrCore('model-0.2.28', maxvers=(0, 2, 24)) as core:
577
+ # Do some pre-migration validation of the cortex. It's still a
578
+ # little weird in here because the CPE types have been updated so
579
+ # some lifting/pivoting won't work right.
580
+
581
+ views = await core.callStorm('return($lib.view.list(deporder=$lib.true))')
582
+ self.len(3, views)
583
+
584
+ fork00 = views[1].get('iden')
585
+ infork00 = {'view': fork00}
586
+
587
+ nodes = await core.nodes('it:sec:cpe')
588
+ self.len(11, nodes)
589
+ for node in nodes:
590
+ self.isin('test.cpe', node.tags)
591
+ data = await s_tests.alist(node.iterData())
592
+ self.eq([k[0] for k in data], ('cpe22', 'cpe23'))
593
+
594
+ nodes = await core.nodes('it:sec:cpe -(refs)> risk:vuln | uniq')
595
+ self.len(1, nodes)
596
+ self.eq(nodes[0].ndef, ('risk:vuln', s_common.guid(('risk', 'vuln'))))
597
+
598
+ nodes = await core.nodes('risk:vulnerable')
599
+ self.len(11, nodes)
600
+ for node in nodes:
601
+ self.nn(node.get('node'))
602
+
603
+ nodes = await core.nodes(r'it:sec:cpe:vendor="d\-link"')
604
+ self.len(1, nodes)
605
+
606
+ nodes = await core.nodes('it:prod:soft', opts=infork00)
607
+ self.len(4, nodes)
608
+ for node in nodes:
609
+ self.isin('test.prod', node.tags)
610
+ self.nn(node.get('cpe'))
611
+
612
+ nodes = await core.nodes('inet:flow', opts=infork00)
613
+ self.len(4, nodes)
614
+ for node in nodes:
615
+ self.isin('test.flow', node.tags)
616
+ dsts = node.get('dst:cpes')
617
+ srcs = node.get('src:cpes')
618
+ self.true((
619
+ (dsts is not None and len(dsts) == 2) or
620
+ (srcs is not None and len(srcs) == 2)
621
+ ))
622
+
623
+ nodes = await core.nodes('_ext:model:form', opts=infork00)
624
+ self.len(4, nodes)
625
+ for node in nodes:
626
+ self.isin('test.ext', node.tags)
627
+ self.nn(node.get('cpe'))
628
+
629
+ nodes = await core.nodes('meta:source:name="cpe.22.invalid" -(seen)> it:sec:cpe', opts=infork00)
630
+ self.len(5, nodes)
631
+
632
+ nodes = await core.nodes('meta:source:name="cpe.23.invalid" -(seen)> it:sec:cpe', opts=infork00)
633
+ self.len(6, nodes)
634
+
635
+ nodes = await core.nodes('meta:source:name="cpe.22.invalid" -> meta:seen', opts=infork00)
636
+ self.len(5, nodes)
637
+
638
+ nodes = await core.nodes('meta:source:name="cpe.23.invalid" -> meta:seen', opts=infork00)
639
+ self.len(6, nodes)
640
+
641
+ nodes = await core.nodes('it:sec:vuln:scan:result', opts=infork00)
642
+ self.len(11, nodes)
643
+
644
+ async with self.getRegrCore('model-0.2.28') as core:
645
+
646
+ views = await core.callStorm('return($lib.view.list(deporder=$lib.true))')
647
+ self.len(3, views)
648
+
649
+ fork00 = views[1].get('iden')
650
+ infork00 = {'view': fork00}
651
+
652
+ # Calculate some timestamps
653
+ start = datetime.datetime(year=2020, month=1, day=1, tzinfo=datetime.timezone.utc)
654
+ end = datetime.datetime(year=2021, month=1, day=1, tzinfo=datetime.timezone.utc)
655
+
656
+ start = int(start.timestamp() * 1000)
657
+ end = int(end.timestamp() * 1000)
658
+
659
+ # We started with 11 CPE nodes and two got removed
660
+ nodes = await core.nodes('it:sec:cpe')
661
+ self.len(9, nodes)
662
+ for node in nodes:
663
+ self.isin('test.cpe', node.tags)
664
+ data = await s_tests.alist(node.iterData())
665
+ self.eq([k[0] for k in data], ('cpe22', 'cpe23'))
666
+
667
+ # Check the .seen time was migrated
668
+ seen = node.get('.seen')
669
+ self.nn(seen)
670
+
671
+ self.eq((start, end), seen)
672
+
673
+ nodes = await core.nodes('it:sec:cpe#test.cpe.22invalid +#test.cpe.23invalid')
674
+ self.len(0, nodes)
675
+
676
+ nodes = await core.nodes('it:sec:cpe -(refs)> risk:vuln')
677
+ self.len(9, nodes)
678
+
679
+ nodes = await core.nodes('risk:vulnerable')
680
+ self.len(11, nodes)
681
+
682
+ nodes = await core.nodes('risk:vulnerable:node')
683
+ self.len(9, nodes)
684
+
685
+ nodes = await core.nodes('risk:vulnerable -> it:sec:cpe')
686
+ self.len(9, nodes)
687
+
688
+ nodes = await core.nodes('risk:vulnerable -:node')
689
+ self.len(2, nodes)
690
+
691
+ nodes = await core.nodes('it:prod:soft', opts=infork00)
692
+ self.len(4, nodes)
693
+ for node in nodes:
694
+ self.isin('test.prod', node.tags)
695
+
696
+ nodes = await core.nodes('it:prod:soft:cpe', opts=infork00)
697
+ self.len(3, nodes)
698
+
699
+ nodes = await core.nodes('it:prod:soft -> it:sec:cpe', opts=infork00)
700
+ self.len(3, nodes)
701
+ ndefs = [k.ndef for k in nodes]
702
+ self.sorteq(ndefs, (
703
+ ('it:sec:cpe', 'cpe:2.3:a:1c:1c\\:enterprise:-:*:*:*:*:*:*:*'),
704
+ ('it:sec:cpe', 'cpe:2.3:a:01generator:pireospay:-:*:*:*:*:prestashop:*:*'),
705
+ ('it:sec:cpe', 'cpe:2.3:o:zyxel:nas326_firmware:5.21\\(aazf.14\\)c0:*:*:*:*:*:*:*'),
706
+ ))
707
+
708
+ nodes = await core.nodes('it:prod:soft -:cpe', opts=infork00)
709
+ self.len(1, nodes)
710
+ self.eq(nodes[0].get('name'), '22i-23i')
711
+
712
+ nodes = await core.nodes('inet:flow', opts=infork00)
713
+ self.len(4, nodes)
714
+
715
+ nodes = await core.nodes('inet:flow +(:src:cpes or :dst:cpes)', opts=infork00)
716
+ self.len(3, nodes)
717
+
718
+ nodes = await core.nodes('inet:flow -(:src:cpes or :dst:cpes)', opts=infork00)
719
+ self.len(1, nodes)
720
+ self.eq(nodes[0].repr(), s_common.guid(('flow', '22i', '23i')))
721
+
722
+ nodes = await core.nodes('inet:flow -> it:sec:cpe', opts=infork00)
723
+ self.len(6, nodes)
724
+ ndefs = [k.ndef for k in nodes]
725
+ self.sorteq(ndefs, (
726
+ ('it:sec:cpe', 'cpe:2.3:a:10web:social_feed_for_instagram:1.0.0:*:*:*:premium:wordpress:*:*'),
727
+ ('it:sec:cpe', 'cpe:2.3:o:zyxel:nas326_firmware:5.21\\(aazf.14\\)c0:*:*:*:*:*:*:*'),
728
+ ('it:sec:cpe', 'cpe:2.3:a:01generator:pireospay:-:*:*:*:*:prestashop:*:*'),
729
+ ('it:sec:cpe', 'cpe:2.3:a:abine:donottrackme_-_mobile_privacy:1.1.8:*:*:*:*:android:*:*'),
730
+ ('it:sec:cpe', 'cpe:2.3:a:1c:1c\\:enterprise:-:*:*:*:*:*:*:*'),
731
+ ('it:sec:cpe', 'cpe:2.3:a:abinitio:control\\>center:-:*:*:*:*:*:*:*'),
732
+ ))
733
+
734
+ nodes = await core.nodes('_ext:model:form', opts=infork00)
735
+ self.len(4, nodes)
736
+
737
+ nodes = await core.nodes('_ext:model:form:cpe', opts=infork00)
738
+ self.len(3, nodes)
739
+
740
+ nodes = await core.nodes('_ext:model:form -:cpe', opts=infork00)
741
+ self.len(1, nodes)
742
+
743
+ nodes = await core.nodes('_ext:model:form -> it:sec:cpe', opts=infork00)
744
+ self.len(3, nodes)
745
+ ndefs = [k.ndef for k in nodes]
746
+ self.sorteq(ndefs, (
747
+ ('it:sec:cpe', 'cpe:2.3:a:01generator:pireospay:-:*:*:*:*:prestashop:*:*'),
748
+ ('it:sec:cpe', r'cpe:2.3:a:acurax:under_construction_\/_maintenance_mode:-:*:*:*:*:wordpress:*:*'),
749
+ ('it:sec:cpe', r'cpe:2.3:a:1c:1c\:enterprise:-:*:*:*:*:*:*:*'),
750
+ ))
751
+
752
+ nodes = await core.nodes('meta:seen', opts=infork00)
753
+ self.len(3, nodes)
754
+
755
+ nodes = await core.nodes('meta:seen -> it:sec:cpe', opts=infork00)
756
+ self.len(3, nodes)
757
+ ndefs = [k.ndef for k in nodes]
758
+ self.sorteq(ndefs, (
759
+ ('it:sec:cpe', 'cpe:2.3:a:abinitio:control\\>center:-:*:*:*:*:*:*:*'),
760
+ ('it:sec:cpe', 'cpe:2.3:a:1c:1c\\:enterprise:-:*:*:*:*:*:*:*'),
761
+ ('it:sec:cpe', 'cpe:2.3:o:zyxel:nas542_firmware:5.21\\%28aazf.15\\%29co:*:*:*:*:*:*:*'),
762
+ ))
763
+
764
+ nodes = await core.nodes('it:sec:cpe -> meta:seen -> it:sec:vuln:scan:result', opts=infork00)
765
+ self.len(3, nodes)
766
+ ndefs = [k.ndef for k in nodes]
767
+ self.sorteq(ndefs, (
768
+ ('it:sec:vuln:scan:result', 'd5cd9c6f53ad552d7c84ad5791b80db0'),
769
+ ('it:sec:vuln:scan:result', '144b8d8cb35c605dcd1f079250921c6d'),
770
+ ('it:sec:vuln:scan:result', '7aae05f91c41dafbf01f2dec8fcf97cd'),
771
+ ))
772
+
773
+ # Check that we correctly copied over the edges
774
+ nodes = await core.nodes('risk:vuln <(refs)- it:sec:cpe')
775
+ self.len(9, nodes)
776
+
777
+ # Check that we correctly copied over the tags
778
+ nodes = await core.nodes(r'it:sec:cpe="cpe:2.3:o:zyxel:nas326_firmware:5.21\(aazf.14\)c0:*:*:*:*:*:*:*"')
779
+ self.len(1, nodes)
780
+ self.isin('test.cpe.22valid', nodes[0].tags)
781
+ self.isin('test.cpe.23invalid', nodes[0].tags)
782
+
783
+ nodes = await core.nodes('it:sec:cpe="cpe:2.3:a:10web:social_feed_for_instagram:1.0.0:*:*:*:premium:wordpress:*:*"')
784
+ self.len(1, nodes)
785
+ self.isin('test.cpe.22valid', nodes[0].tags)
786
+ self.isin('test.cpe.23invalid', nodes[0].tags)
787
+
788
+ nodes = await core.nodes(r'it:sec:cpe="cpe:2.3:a:acurax:under_construction_\/_maintenance_mode:-:*:*:*:*:wordpress:*:*"')
789
+ self.len(1, nodes)
790
+ self.isin('test.cpe.22valid', nodes[0].tags)
791
+ self.isin('test.cpe.23invalid', nodes[0].tags)
792
+
793
+ nodes = await core.nodes('it:sec:cpe="cpe:2.3:h:d-link:dir-850l:*:*:*:*:*:*:*:*"')
794
+ self.len(1, nodes)
795
+ self.isin('test.cpe.22valid', nodes[0].tags)
796
+ self.isin('test.cpe.23invalid', nodes[0].tags)
797
+
798
+ # Check that we correctly copied over the node data
799
+ nodes = await core.nodes(r'it:sec:cpe="cpe:2.3:o:zyxel:nas326_firmware:5.21\(aazf.14\)c0:*:*:*:*:*:*:*"')
800
+ self.len(1, nodes)
801
+ data = await s_tests.alist(nodes[0].iterData())
802
+ self.sorteq(data, (('cpe23', 'invalid'), ('cpe22', 'valid')))
803
+
804
+ nodes = await core.nodes('it:sec:cpe="cpe:2.3:a:10web:social_feed_for_instagram:1.0.0:*:*:*:premium:wordpress:*:*"')
805
+ self.len(1, nodes)
806
+ data = await s_tests.alist(nodes[0].iterData())
807
+ self.sorteq(data, (('cpe23', 'invalid'), ('cpe22', 'valid')))
808
+
809
+ nodes = await core.nodes(r'it:sec:cpe="cpe:2.3:a:acurax:under_construction_\/_maintenance_mode:-:*:*:*:*:wordpress:*:*"')
810
+ self.len(1, nodes)
811
+ data = await s_tests.alist(nodes[0].iterData())
812
+ self.sorteq(data, (('cpe23', 'invalid'), ('cpe22', 'valid')))
813
+
814
+ nodes = await core.nodes('it:sec:cpe="cpe:2.3:h:d-link:dir-850l:*:*:*:*:*:*:*:*"')
815
+ self.len(1, nodes)
816
+ data = await s_tests.alist(nodes[0].iterData())
817
+ self.sorteq(data, (('cpe23', 'invalid'), ('cpe22', 'valid')))
818
+
819
+ # Check that we correctly copied over the extended props
820
+ nodes = await core.nodes(r'it:sec:cpe="cpe:2.3:o:zyxel:nas326_firmware:5.21\(aazf.14\)c0:*:*:*:*:*:*:*"')
821
+ self.len(1, nodes)
822
+ self.true(nodes[0].get('_cpe22valid'))
823
+ self.false(nodes[0].get('_cpe23valid'))
824
+
825
+ nodes = await core.nodes('it:sec:cpe="cpe:2.3:a:10web:social_feed_for_instagram:1.0.0:*:*:*:premium:wordpress:*:*"')
826
+ self.len(1, nodes)
827
+ self.true(nodes[0].get('_cpe22valid'))
828
+ self.false(nodes[0].get('_cpe23valid'))
829
+
830
+ nodes = await core.nodes(r'it:sec:cpe="cpe:2.3:a:acurax:under_construction_\/_maintenance_mode:-:*:*:*:*:wordpress:*:*"')
831
+ self.len(1, nodes)
832
+ self.true(nodes[0].get('_cpe22valid'))
833
+ self.false(nodes[0].get('_cpe23valid'))
834
+
835
+ nodes = await core.nodes('it:sec:cpe="cpe:2.3:h:d-link:dir-850l:*:*:*:*:*:*:*:*"')
836
+ self.len(1, nodes)
837
+ self.true(nodes[0].get('_cpe22valid'))
838
+ self.false(nodes[0].get('_cpe23valid'))
839
+
840
+ async with self.getRegrCore('model-0.2.28') as core:
841
+
842
+ views = await core.callStorm('return($lib.view.list(deporder=$lib.true))')
843
+ self.len(3, views)
844
+
845
+ fork00 = views[1].get('iden') # forked view
846
+ forklayr = views[1].get('layers')[0].get('iden')
847
+
848
+ view00 = views[0].get('iden') # default view
849
+ viewlayr = views[0].get('layers')[0].get('iden')
850
+
851
+ opts = {'view': fork00}
852
+
853
+ nodes = await core.nodes('meta:source:name="cpe.22.invalid"', opts=opts)
854
+ self.len(1, nodes)
855
+ source00 = nodes[0]
856
+
857
+ nodes = await core.nodes('meta:source:name="cpe.23.invalid"', opts=opts)
858
+ self.len(1, nodes)
859
+ source01 = nodes[0]
860
+
861
+ source22 = source00.ndef[1]
862
+ source22iden = source00.iden()
863
+
864
+ source23 = source01.ndef[1]
865
+ source23iden = source01.iden()
866
+
867
+ invcpe00 = 'cpe:2.3:a:10web:social_feed_for_instagram:1.0.0::~~premium~wordpress~~:*:*:*:*:*'
868
+ invcpe01 = 'cpe:2.3:a:acurax:under_construction_%2f_maintenance_mode:-::~~~wordpress~~:*:*:*:*:*'
869
+ invcpe02 = 'cpe:2.3:a:openbsd:openssh:7.4\r\n:*:*:*:*:*:*:*'
870
+ invcpe03 = 'cpe:2.3:a:openbsd:openssh:8.2p1 ubuntu-4ubuntu0.2:*:*:*:*:*:*:*'
871
+ invcpe04 = 'cpe:2.3:h:d\\-link:dir\\-850l:*:*:*:*:*:*:*:*'
872
+ invcpe05 = 'cpe:2.3:o:zyxel:nas326_firmware:5.21%28aazf.14%29c0:*:*:*:*:*:*:*'
873
+
874
+ metaseen00 = s_common.ehex(s_common.buid(('meta:seen', (source23, ('it:sec:cpe', invcpe00)))))
875
+ metaseen01 = s_common.ehex(s_common.buid(('meta:seen', (source23, ('it:sec:cpe', invcpe01)))))
876
+ metaseen02 = s_common.ehex(s_common.buid(('meta:seen', (source22, ('it:sec:cpe', invcpe02)))))
877
+ metaseen03 = s_common.ehex(s_common.buid(('meta:seen', (source23, ('it:sec:cpe', invcpe02)))))
878
+ metaseen04 = s_common.ehex(s_common.buid(('meta:seen', (source23, ('it:sec:cpe', invcpe03)))))
879
+ metaseen05 = s_common.ehex(s_common.buid(('meta:seen', (source22, ('it:sec:cpe', invcpe03)))))
880
+ metaseen06 = s_common.ehex(s_common.buid(('meta:seen', (source23, ('it:sec:cpe', invcpe04)))))
881
+ metaseen07 = s_common.ehex(s_common.buid(('meta:seen', (source23, ('it:sec:cpe', invcpe05)))))
882
+
883
+ badcpe00 = s_common.ehex(s_common.buid(('it:sec:cpe', invcpe02)))
884
+ badcpe01 = s_common.ehex(s_common.buid(('it:sec:cpe', invcpe03)))
885
+
886
+ '''
887
+ There are two CPEs that we couldn't migrate. They should be fully
888
+ represented in the following three queues for potentially being
889
+ rebuilt later.
890
+
891
+ badcpe00: it:sec:cpe="cpe:2.3:a:openbsd:openssh:7.4\r\n:*:*:*:*:*:*:*"
892
+ badcpe01: it:sec:cpe="cpe:2.3:a:openbsd:openssh:8.2p1 ubuntu-4ubuntu0.2:*:*:*:*:*:*:*"
893
+ '''
894
+
895
+ queues = await core.callStorm('return($lib.queue.list())')
896
+ [q.pop('meta') for q in queues]
897
+ self.len(3, queues)
898
+ self.eq(queues, (
899
+ {'name': 'model_0_2_28:nodes', 'size': 10, 'offs': 10},
900
+ {'name': 'model_0_2_28:nodes:refs', 'size': 14, 'offs': 14},
901
+ {'name': 'model_0_2_28:nodes:edges', 'size': 4, 'offs': 4},
902
+ ))
903
+
904
+ q = '''
905
+ $ret = ([])
906
+ $q = $lib.queue.get('model_0_2_28:nodes')
907
+ for $ii in $lib.range(($q.size())) {
908
+ $ret.append($q.get($ii, cull=(false), wait=(false)))
909
+ }
910
+ fini { return($ret) }
911
+ '''
912
+ nodesq = await core.callStorm(q)
913
+ for item in nodesq:
914
+ self.nn(item[1]['props'].pop('.created'))
915
+
916
+ self.eq(nodesq, [
917
+ (0,
918
+ {'data': (),
919
+ 'form': 'meta:seen',
920
+ 'iden': metaseen00,
921
+ 'layer': forklayr,
922
+ 'props': {'node': ('it:sec:cpe', invcpe00),
923
+ 'source': source23},
924
+ 'repr': (source23, ('it:sec:cpe', invcpe00)),
925
+ 'sources': (),
926
+ 'tags': (),
927
+ 'view': fork00}),
928
+ (1,
929
+ {'data': (),
930
+ 'form': 'meta:seen',
931
+ 'iden': metaseen01,
932
+ 'layer': forklayr,
933
+ 'props': {'node': ('it:sec:cpe', invcpe01),
934
+ 'source': source23},
935
+ 'repr': (source23, ('it:sec:cpe', invcpe01)),
936
+ 'sources': (),
937
+ 'tags': (),
938
+ 'view': fork00}),
939
+ (2,
940
+ {'data': (),
941
+ 'form': 'meta:seen',
942
+ 'iden': metaseen02,
943
+ 'layer': forklayr,
944
+ 'props': {'node': ('it:sec:cpe', invcpe02),
945
+ 'source': source22},
946
+ 'repr': (source22, ('it:sec:cpe', invcpe02)),
947
+ 'sources': (),
948
+ 'tags': (),
949
+ 'view': fork00}),
950
+ (3,
951
+ {'data': (),
952
+ 'form': 'meta:seen',
953
+ 'iden': metaseen03,
954
+ 'layer': forklayr,
955
+ 'props': {'node': ('it:sec:cpe', invcpe02),
956
+ 'source': source23},
957
+ 'repr': (source23, ('it:sec:cpe', invcpe02)),
958
+ 'sources': (),
959
+ 'tags': (),
960
+ 'view': fork00}),
961
+ (4,
962
+ {'data': (('cpe22', 'invalid'), ('cpe23', 'invalid')),
963
+ 'form': 'it:sec:cpe',
964
+ 'iden': badcpe00,
965
+ 'layer': viewlayr,
966
+ 'props': {'.seen': (1577836800000, 1609459200000),
967
+ 'edition': '*',
968
+ 'language': '*',
969
+ 'other': '*',
970
+ 'part': 'a',
971
+ 'product': 'openssh',
972
+ 'sw_edition': '*',
973
+ 'target_hw': '*',
974
+ 'target_sw': '*',
975
+ 'update': '*',
976
+ 'v2_2': 'cpe:/a:openbsd:openssh:7.4\r\n',
977
+ 'vendor': 'openbsd',
978
+ 'version': '7.4',
979
+ '_cpe22valid': 0,
980
+ '_cpe23valid': 0},
981
+ 'repr': invcpe02,
982
+ 'sources': (source23,
983
+ source22),
984
+ 'tags': ('test', 'test.cpe', 'test.cpe.23invalid', 'test.cpe.22invalid'),
985
+ 'view': view00}),
986
+ (5,
987
+ {'data': (),
988
+ 'form': 'meta:seen',
989
+ 'iden': metaseen04,
990
+ 'layer': forklayr,
991
+ 'props': {'node': ('it:sec:cpe', invcpe03),
992
+ 'source': source23},
993
+ 'repr': (source23, ('it:sec:cpe', invcpe03)),
994
+ 'sources': (),
995
+ 'tags': (),
996
+ 'view': fork00}),
997
+ (6,
998
+ {'data': (),
999
+ 'form': 'meta:seen',
1000
+ 'iden': metaseen05,
1001
+ 'layer': forklayr,
1002
+ 'props': {'node': ('it:sec:cpe', invcpe03),
1003
+ 'source': source22},
1004
+ 'repr': (source22, ('it:sec:cpe', invcpe03)),
1005
+ 'sources': (),
1006
+ 'tags': (),
1007
+ 'view': fork00}),
1008
+ (7,
1009
+ {'data': (('cpe22', 'invalid'), ('cpe23', 'invalid')),
1010
+ 'form': 'it:sec:cpe',
1011
+ 'iden': badcpe01,
1012
+ 'layer': viewlayr,
1013
+ 'props': {'.seen': (1577836800000, 1609459200000),
1014
+ 'edition': '*',
1015
+ 'language': '*',
1016
+ 'other': '*',
1017
+ 'part': 'a',
1018
+ 'product': 'openssh',
1019
+ 'sw_edition': '*',
1020
+ 'target_hw': '*',
1021
+ 'target_sw': '*',
1022
+ 'update': '*',
1023
+ 'v2_2': 'cpe:/a:openbsd:openssh:8.2p1 ubuntu-4ubuntu0.2',
1024
+ 'vendor': 'openbsd',
1025
+ 'version': '8.2p1 ubuntu-4ubuntu0.2',
1026
+ '_cpe22valid': 0,
1027
+ '_cpe23valid': 0},
1028
+ 'repr': invcpe03,
1029
+ 'sources': (source23,
1030
+ source22),
1031
+ 'tags': ('test', 'test.cpe', 'test.cpe.23invalid', 'test.cpe.22invalid'),
1032
+ 'view': view00}),
1033
+ (8,
1034
+ {'data': (),
1035
+ 'form': 'meta:seen',
1036
+ 'iden': metaseen06,
1037
+ 'layer': forklayr,
1038
+ 'props': {'node': ('it:sec:cpe', invcpe04),
1039
+ 'source': source23},
1040
+ 'repr': (source23, ('it:sec:cpe', invcpe04)),
1041
+ 'sources': (),
1042
+ 'tags': (),
1043
+ 'view': fork00}),
1044
+ (9,
1045
+ {'data': (),
1046
+ 'form': 'meta:seen',
1047
+ 'iden': metaseen07,
1048
+ 'layer': forklayr,
1049
+ 'props': {'node': ('it:sec:cpe', invcpe05),
1050
+ 'source': source23},
1051
+ 'repr': (source23, ('it:sec:cpe', invcpe05)),
1052
+ 'sources': (),
1053
+ 'tags': (),
1054
+ 'view': fork00}),
1055
+ ])
1056
+
1057
+ q = '''
1058
+ $ret = ([])
1059
+ $q = $lib.queue.get('model_0_2_28:nodes:refs')
1060
+ for $ii in $lib.range(($q.size())) {
1061
+ $ret.append($q.get($ii, cull=(false), wait=(false)))
1062
+ }
1063
+ fini { return($ret) }
1064
+ '''
1065
+ refsq = await core.callStorm(q)
1066
+ self.eq(refsq, [
1067
+ (0,
1068
+ {'iden': metaseen00,
1069
+ 'refs': ({'iden': '86288a55af26e1314ae60e12c54c02f4af2e22ed1580166b39f5352762856335',
1070
+ 'refinfo': ('it:sec:vuln:scan:result', 'asset', 'ndef', False)},),
1071
+ 'view': fork00}),
1072
+ (1,
1073
+ {'iden': metaseen01,
1074
+ 'refs': ({'iden': '1e0ce923f3dbd57b11d5d95cc5d6d1ccd4de4aba9b6534d57eaa0a2433af9430',
1075
+ 'refinfo': ('it:sec:vuln:scan:result', 'asset', 'ndef', False)},),
1076
+ 'view': fork00}),
1077
+ (2,
1078
+ {'iden': badcpe00,
1079
+ 'refs': ({'iden': 'd2c0737b821ba0a699e1ff168e2bf1677590dbf677ce7e5c02894f8868ae080a',
1080
+ 'refinfo': ('risk:vulnerable', 'node', 'ndef', False)},),
1081
+ 'view': view00}),
1082
+ (3,
1083
+ {'iden': badcpe00,
1084
+ 'refs': ({'iden': '7d4c31f1364aaf0b4cfaf4b57bb60157f2e86248391ce8ec75d6b7e3cd5f35b7',
1085
+ 'refinfo': ('inet:flow', 'src:cpes', 'it:sec:cpe', True)},),
1086
+ 'view': fork00}),
1087
+ (4,
1088
+ {'iden': metaseen02,
1089
+ 'refs': ({'iden': '11f7e64a8dd8aa5f2a9b52c0e95783da4b7486452aff74dfcf80814f72507f88',
1090
+ 'refinfo': ('it:sec:vuln:scan:result', 'asset', 'ndef', False)},),
1091
+ 'view': fork00}),
1092
+ (5,
1093
+ {'iden': metaseen03,
1094
+ 'refs': ({'iden': 'b209cfe6fb7167cc7dbae9df50894c2614cb9e179e5b3a4fd85fbcf7fa31a9dd',
1095
+ 'refinfo': ('it:sec:vuln:scan:result', 'asset', 'ndef', False)},),
1096
+ 'view': fork00}),
1097
+ (6,
1098
+ {'iden': badcpe01,
1099
+ 'refs': ({'iden': '5fddf1b5fa06aa8a39a1eb297712cecf9ca146764c4d6e5c79296b9e9978d2c3',
1100
+ 'refinfo': ('risk:vulnerable', 'node', 'ndef', False)},),
1101
+ 'view': view00}),
1102
+ (7,
1103
+ {'iden': badcpe01,
1104
+ 'refs': ({'iden': '9742664e24fe1a3a37d871b1f62af27453c2945b98f421d753db8436e9a44cc9',
1105
+ 'refinfo': ('it:prod:soft', 'cpe', 'it:sec:cpe', False)},),
1106
+ 'view': fork00}),
1107
+ (8,
1108
+ {'iden': badcpe01,
1109
+ 'refs': ({'iden': '16e3289346a258c3e3073affad490c1d6ebf1d01295aacc489cdb24658ebc6e7',
1110
+ 'refinfo': ('_ext:model:form', 'cpe', 'it:sec:cpe', False)},),
1111
+ 'view': fork00}),
1112
+ (9,
1113
+ {'iden': badcpe01,
1114
+ 'refs': ({'iden': '7d4c31f1364aaf0b4cfaf4b57bb60157f2e86248391ce8ec75d6b7e3cd5f35b7',
1115
+ 'refinfo': ('inet:flow', 'src:cpes', 'it:sec:cpe', True)},),
1116
+ 'view': fork00}),
1117
+ (10,
1118
+ {'iden': metaseen04,
1119
+ 'refs': ({'iden': '6d09c45666b3a14bf9d298079344d01c079e474423307da553d65ad9917556ae',
1120
+ 'refinfo': ('it:sec:vuln:scan:result', 'asset', 'ndef', False)},),
1121
+ 'view': fork00}),
1122
+ (11,
1123
+ {'iden': metaseen05,
1124
+ 'refs': ({'iden': '208ea1b5593aff3c9cb51c19374616fcd103ea2f554f0dd2a13652aadabb82ae',
1125
+ 'refinfo': ('it:sec:vuln:scan:result', 'asset', 'ndef', False)},),
1126
+ 'view': fork00}),
1127
+ (12,
1128
+ {'iden': metaseen06,
1129
+ 'refs': ({'iden': 'e3c389c194609a57cde68c21cac8ae1cd18e6a642e332461a3acd19138904239',
1130
+ 'refinfo': ('it:sec:vuln:scan:result', 'asset', 'ndef', False)},),
1131
+ 'view': fork00}),
1132
+ (13,
1133
+ {'iden': metaseen07,
1134
+ 'refs': ({'iden': '53ad1502b6f6de3d9d4efe72cc101cd3889e47323ac8db5e3fd39ae68c72f141',
1135
+ 'refinfo': ('it:sec:vuln:scan:result', 'asset', 'ndef', False)},),
1136
+ 'view': fork00}),
1137
+ ])
1138
+
1139
+ riskvuln00 = await core.callStorm('risk:vuln return($node.iden())')
1140
+ q = '''
1141
+ $ret = ([])
1142
+ $q = $lib.queue.get('model_0_2_28:nodes:edges')
1143
+ for $ii in $lib.range(($q.size())) {
1144
+ $ret.append($q.get($ii, cull=(false), wait=(false)))
1145
+ }
1146
+ fini { return($ret) }
1147
+ '''
1148
+ edgesq = await core.callStorm(q)
1149
+ self.eq(edgesq, [
1150
+ (0,
1151
+ {'direction': 'n1',
1152
+ 'edges': (('refs', riskvuln00),),
1153
+ 'iden': badcpe00,
1154
+ 'view': view00}),
1155
+ (1,
1156
+ {'direction': 'n2',
1157
+ 'edges': (('seen', source23iden), ('seen', source22iden)),
1158
+ 'iden': badcpe00,
1159
+ 'view': fork00}),
1160
+ (2,
1161
+ {'direction': 'n1',
1162
+ 'edges': (('refs', riskvuln00),),
1163
+ 'iden': badcpe01,
1164
+ 'view': view00}),
1165
+ (3,
1166
+ {'direction': 'n2',
1167
+ 'edges': (('seen', source23iden), ('seen', source22iden)),
1168
+ 'iden': badcpe01,
1169
+ 'view': fork00}),
1170
+ ])
1171
+
1172
+ async def test_modelrev_0_2_29(self):
1173
+ async with self.getRegrCore('model-0.2.29') as core:
1174
+ self.len(2, await core.nodes('ou:industry:type:taxonomy'))
1175
+
1176
+ async def test_modelrev_0_2_30(self):
1177
+ async with self.getRegrCore('model-0.2.30') as core:
1178
+ q = '''
1179
+ inet:ipv4=192.0.0.0 inet:ipv4=192.0.0.8 inet:ipv4=192.0.0.9 inet:ipv4=192.0.0.10 inet:ipv4=192.0.0.255
1180
+ '''
1181
+ nodes = await core.nodes(q)
1182
+ typz = [node.get('type') for node in nodes]
1183
+ self.eq(typz, ['private', 'private', 'unicast', 'unicast', 'private'])
1184
+
1185
+ q = '''
1186
+ inet:ipv6="64:ff9b:1::" inet:ipv6="64:ff9b:1::1" inet:ipv6="64:ff9b:1::ffff" inet:ipv6="64:ff9b:1::ffff:1"
1187
+ '''
1188
+ nodes = await core.nodes(q)
1189
+ typz = [node.get('type') for node in nodes]
1190
+ self.eq(typz, ['private', 'private', 'private', 'private'])
1191
+
1192
+ q = '''
1193
+ inet:ipv6="2002::" inet:ipv6="2002::1" inet:ipv6="2002::fffe" inet:ipv6="2002::ffff"
1194
+ '''
1195
+ nodes = await core.nodes(q)
1196
+ typz = [node.get('type') for node in nodes]
1197
+ self.eq(typz, ['private', 'private', 'private', 'private'])
1198
+
1199
+ q = 'inet:ipv6="2001:1::1/128" inet:ipv6="2001:1::2/128"'
1200
+ nodes = await core.nodes(q)
1201
+ typz = [node.get('type') for node in nodes]
1202
+ self.eq(typz, ['unicast', 'unicast'])
1203
+
1204
+ q = 'inet:ipv6="2001:3::" inet:ipv6="2001:3::1" inet:ipv6="2001:3::ffff"'
1205
+ nodes = await core.nodes(q)
1206
+ typz = [node.get('type') for node in nodes]
1207
+ self.eq(typz, ['unicast', 'unicast', 'unicast'])
1208
+
1209
+ q = 'inet:ipv6="2001:4:112::" inet:ipv6="2001:4:112::1" inet:ipv6="2001:4:112::ffff"'
1210
+ nodes = await core.nodes(q)
1211
+ typz = [node.get('type') for node in nodes]
1212
+ self.eq(typz, ['unicast', 'unicast', 'unicast'])
1213
+
1214
+ q = 'inet:ipv6="2001:20::" inet:ipv6="2001:20::1" inet:ipv6="2001:20::ffff"'
1215
+ nodes = await core.nodes(q)
1216
+ typz = [node.get('type') for node in nodes]
1217
+ self.eq(typz, ['unicast', 'unicast', 'unicast'])
1218
+
1219
+ q = 'inet:ipv6="2001:30::" inet:ipv6="2001:30::1" inet:ipv6="2001:30::ffff"'
1220
+ nodes = await core.nodes(q)
1221
+ typz = [node.get('type') for node in nodes]
1222
+ self.eq(typz, ['unicast', 'unicast', 'unicast'])