synapse 2.179.0__py311-none-any.whl → 2.180.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.

synapse/lib/schemas.py CHANGED
@@ -493,3 +493,61 @@ driveDataVersSchema = {
493
493
  'additionalProperties': False,
494
494
  }
495
495
  reqValidDriveDataVers = s_config.getJsValidator(driveDataVersSchema)
496
+
497
+ stixIngestConfigSchema = {
498
+ 'type': 'object',
499
+ 'properties': {
500
+ 'bundle': {
501
+ 'type': ['object', 'null'],
502
+ 'properties': {'storm': {'type': 'string'}},
503
+ },
504
+ 'objects': {
505
+ 'type': 'object',
506
+ 'properties': {'storm': {'type': 'string'}},
507
+ },
508
+ 'relationships': {
509
+ 'type': 'array',
510
+ 'items': {
511
+ 'type': 'object',
512
+ 'properties': {
513
+ 'type': {
514
+ 'type': 'array',
515
+ 'items': {
516
+ 'type': ['string', 'null'],
517
+ 'minItems': 3,
518
+ 'maxItems': 3,
519
+ },
520
+ },
521
+ 'storm': {'type': 'string'},
522
+ },
523
+ 'required': ['type'],
524
+ },
525
+ },
526
+ },
527
+ 'required': ['bundle', 'objects'],
528
+ }
529
+ reqValidStixIngestConfig = s_config.getJsValidator(stixIngestConfigSchema)
530
+
531
+ stixIngestBundleSchema = {
532
+ 'type': 'object',
533
+ 'properties': {
534
+ 'objects': {
535
+ 'type': 'array',
536
+ 'items': {
537
+ 'type': 'object',
538
+ 'properties': {
539
+ 'id': {'type': 'string'},
540
+ 'type': {'type': 'string'},
541
+ 'object_refs': {'type': 'array', 'items': {'type': 'string'}},
542
+ 'relationship_type': {'type': 'string'},
543
+ 'source_ref': {'type': 'string'},
544
+ 'target_ref': {'type': 'string'},
545
+ },
546
+ 'required': ['id', 'type'],
547
+ 'if': {'properties': {'type': {'const': 'relationship'}}},
548
+ 'then': {'required': ['source_ref', 'target_ref']},
549
+ }
550
+ },
551
+ },
552
+ }
553
+ reqValidStixIngestBundle = s_config.getJsValidator(stixIngestBundleSchema)
synapse/lib/snap.py CHANGED
@@ -736,6 +736,7 @@ class Snap(s_base.Base):
736
736
 
737
737
  dorepr = False
738
738
  dopath = False
739
+ dolink = False
739
740
 
740
741
  show_storage = False
741
742
 
@@ -754,6 +755,7 @@ class Snap(s_base.Base):
754
755
  if opts is not None:
755
756
  dorepr = opts.get('repr', False)
756
757
  dopath = opts.get('path', False)
758
+ dolink = opts.get('links', False)
757
759
  show_storage = opts.get('show:storage', False)
758
760
 
759
761
  async for node, path in self.storm(text, opts=opts, user=user):
@@ -761,6 +763,9 @@ class Snap(s_base.Base):
761
763
  pode = node.pack(dorepr=dorepr)
762
764
  pode[1]['path'] = await path.pack(path=dopath)
763
765
 
766
+ if dolink:
767
+ pode[1]['links'] = path.links
768
+
764
769
  if show_storage:
765
770
  pode[1]['storage'] = await node.getStorNodes()
766
771
 
@@ -1612,18 +1617,28 @@ class Snap(s_base.Base):
1612
1617
  last = verb
1613
1618
  yield verb
1614
1619
 
1615
- async def getNdefRefs(self, buid):
1620
+ async def _getLayrNdefProp(self, layr, buid):
1621
+ async for refsbuid, refsabrv in layr.getNdefRefs(buid):
1622
+ yield refsbuid, layr.getAbrvProp(refsabrv)
1623
+
1624
+ async def getNdefRefs(self, buid, props=False):
1616
1625
  last = None
1617
- gens = [layr.getNdefRefs(buid) for layr in self.layers]
1626
+ if props:
1627
+ gens = [self._getLayrNdefProp(layr, buid) for layr in self.layers]
1628
+ else:
1629
+ gens = [layr.getNdefRefs(buid) for layr in self.layers]
1618
1630
 
1619
- async for refsbuid, _ in s_common.merggenr2(gens):
1631
+ async for refsbuid, xtra in s_common.merggenr2(gens):
1620
1632
  if refsbuid == last:
1621
1633
  continue
1622
1634
 
1623
1635
  await asyncio.sleep(0)
1624
1636
  last = refsbuid
1625
1637
 
1626
- yield refsbuid
1638
+ if props:
1639
+ yield refsbuid, xtra[1]
1640
+ else:
1641
+ yield refsbuid
1627
1642
 
1628
1643
  async def hasNodeData(self, buid, name):
1629
1644
  '''
synapse/lib/storm.py CHANGED
@@ -5377,7 +5377,7 @@ class TeeCmd(Cmd):
5377
5377
 
5378
5378
  outq = asyncio.Queue(maxsize=outq_size)
5379
5379
  for subr in runts:
5380
- subg = s_common.agen((node, path.fork(node)))
5380
+ subg = s_common.agen((node, path.fork(node, None)))
5381
5381
  self.runt.snap.schedCoro(self.pipeline(subr, outq, genr=subg))
5382
5382
 
5383
5383
  exited = 0
@@ -5399,7 +5399,7 @@ class TeeCmd(Cmd):
5399
5399
  else:
5400
5400
 
5401
5401
  for subr in runts:
5402
- subg = s_common.agen((node, path.fork(node)))
5402
+ subg = s_common.agen((node, path.fork(node, None)))
5403
5403
  async for subitem in subr.execute(genr=subg):
5404
5404
  yield subitem
5405
5405
 
@@ -5553,6 +5553,7 @@ class ScrapeCmd(Cmd):
5553
5553
  if not todo:
5554
5554
  todo = list(node.props.values())
5555
5555
 
5556
+ link = {'type': 'scrape'}
5556
5557
  for text in todo:
5557
5558
 
5558
5559
  text = str(text)
@@ -5562,7 +5563,7 @@ class ScrapeCmd(Cmd):
5562
5563
  continue
5563
5564
 
5564
5565
  nnode = await node.snap.addNode(form, valu)
5565
- npath = path.fork(nnode)
5566
+ npath = path.fork(nnode, link)
5566
5567
 
5567
5568
  if refs:
5568
5569
  if node.form.isrunt:
@@ -5666,8 +5667,9 @@ class LiftByVerb(Cmd):
5666
5667
 
5667
5668
  yield _node, _path
5668
5669
 
5670
+ link = {'type': 'runtime'}
5669
5671
  async for node in self.iterEdgeNodes(verb, idenset, n2):
5670
- yield node, _path.fork(node)
5672
+ yield node, _path.fork(node, link)
5671
5673
 
5672
5674
  class EdgesDelCmd(Cmd):
5673
5675
  '''
@@ -11,6 +11,7 @@ import synapse.common as s_common
11
11
  import synapse.lib.coro as s_coro
12
12
  import synapse.lib.node as s_node
13
13
  import synapse.lib.msgpack as s_msgpack
14
+ import synapse.lib.schemas as s_schemas
14
15
  import synapse.lib.stormctrl as s_stormctrl
15
16
  import synapse.lib.stormtypes as s_stormtypes
16
17
 
@@ -909,6 +910,9 @@ class LibStixImport(s_stormtypes.Lib):
909
910
 
910
911
  self.runt.layerConfirm(('node', 'edge', 'add', 'refs'))
911
912
 
913
+ config = s_schemas.reqValidStixIngestConfig(config)
914
+ bundle = s_schemas.reqValidStixIngestBundle(bundle)
915
+
912
916
  try:
913
917
  nodesbyid = await self._ingestObjects(bundle, config, rellook)
914
918
  except Exception as e:
synapse/lib/version.py CHANGED
@@ -223,6 +223,6 @@ def reqVersion(valu, reqver,
223
223
  ##############################################################################
224
224
  # The following are touched during the release process by bumpversion.
225
225
  # Do not modify these directly.
226
- version = (2, 179, 0)
226
+ version = (2, 180, 0)
227
227
  verstring = '.'.join([str(x) for x in version])
228
- commit = '1c51c58523e9012655d8d18bfa1ad149e5536c25'
228
+ commit = 'aecbb8c0839f3ad763076dd7acae968fae6ba8b7'
synapse/models/auth.py CHANGED
@@ -45,6 +45,8 @@ class AuthModule(s_module.CoreModule):
45
45
  ('web:acct', ('inet:web:acct', {}), {
46
46
  'doc': 'The web account that the credentials allow access to.',
47
47
  }),
48
+ ('service:account', ('inet:service:account', {}), {
49
+ 'doc': 'The service account that the credentials allow access to.'}),
48
50
  # TODO x509, rfid, mat:item locks/keys
49
51
  )),
50
52
 
synapse/models/geopol.py CHANGED
@@ -139,6 +139,7 @@ class PolModule(s_module.CoreModule):
139
139
  'doc': 'The date of the election.'}),
140
140
  )),
141
141
  # TODO jurisdiction / districts
142
+ # TODO oversight authority
142
143
  ('pol:race', {}, (
143
144
  ('election', ('pol:election', {}), {
144
145
  'doc': 'The election that includes the race.'}),
@@ -175,6 +176,8 @@ class PolModule(s_module.CoreModule):
175
176
  'doc': 'The political party of the person who held office during the term.'}),
176
177
  )),
177
178
  ('pol:candidate', {}, (
179
+ ('id', ('str', {'strip': True}), {
180
+ 'doc': 'A unique ID for the candidate issued by an election authority.'}),
178
181
  ('contact', ('ps:contact', {}), {
179
182
  'doc': 'The contact information of the candidate.'}),
180
183
  ('race', ('pol:race', {}), {
synapse/models/inet.py CHANGED
@@ -1363,6 +1363,7 @@ class InetModule(s_module.CoreModule):
1363
1363
  }),
1364
1364
 
1365
1365
  ('inet:search:query', ('guid', {}), {
1366
+ 'interfaces': ('inet:service:action',),
1366
1367
  'doc': 'An instance of a search query issued to a search engine.',
1367
1368
  }),
1368
1369
 
@@ -757,30 +757,37 @@ class ItModule(s_module.CoreModule):
757
757
  'doc': 'A developer selected label.',
758
758
  }),
759
759
  ('it:dev:repo', ('guid', {}), {
760
+ 'interfaces': ('inet:service:object',),
760
761
  'doc': 'A version control system instance.',
761
762
  }),
762
763
  ('it:dev:repo:remote', ('guid', {}), {
763
764
  'doc': 'A remote repo that is tracked for changes/branches/etc.',
764
765
  }),
765
766
  ('it:dev:repo:branch', ('guid', {}), {
767
+ 'interfaces': ('inet:service:object',),
766
768
  'doc': 'A branch in a version control system instance.',
767
769
  }),
768
770
  ('it:dev:repo:commit', ('guid', {}), {
771
+ 'interfaces': ('inet:service:object',),
769
772
  'doc': 'A commit to a repository.',
770
773
  }),
771
774
  ('it:dev:repo:diff', ('guid', {}), {
772
775
  'doc': 'A diff of a file being applied in a single commit.',
773
776
  }),
774
777
  ('it:dev:repo:issue:label', ('guid', {}), {
778
+ 'interfaces': ('inet:service:object',),
775
779
  'doc': 'A label applied to a repository issue.',
776
780
  }),
777
781
  ('it:dev:repo:issue', ('guid', {}), {
782
+ 'interfaces': ('inet:service:object',),
778
783
  'doc': 'An issue raised in a repository.',
779
784
  }),
780
785
  ('it:dev:repo:issue:comment', ('guid', {}), {
786
+ 'interfaces': ('inet:service:object',),
781
787
  'doc': 'A comment on an issue in a repository.',
782
788
  }),
783
789
  ('it:dev:repo:diff:comment', ('guid', {}), {
790
+ 'interfaces': ('inet:service:object',),
784
791
  'doc': 'A comment on a diff in a repository.',
785
792
  }),
786
793
  ('it:prod:soft', ('guid', {}), {
@@ -1800,21 +1807,22 @@ class ItModule(s_module.CoreModule):
1800
1807
  }),
1801
1808
  ('desc', ('str', {}), {
1802
1809
  'disp': {'hint': 'text'},
1803
- 'doc': 'A free-form description of the repository.',
1804
- }),
1810
+ 'doc': 'A free-form description of the repository.'}),
1811
+
1805
1812
  ('created', ('time', {}), {
1806
- 'doc': 'When the repository was created.',
1807
- }),
1813
+ 'deprecated': True,
1814
+ 'doc': 'Deprecated. Please use :period.'}),
1815
+
1808
1816
  ('url', ('inet:url', {}), {
1809
- 'doc': 'A URL where the repository is hosted.',
1810
- }),
1817
+ 'doc': 'The URL where the repository is hosted.'}),
1818
+
1811
1819
  ('type', ('it:dev:repo:type:taxonomy', {}), {
1812
1820
  'doc': 'The type of the version control system used.',
1813
- 'ex': 'svn'
1814
- }),
1821
+ 'ex': 'svn'}),
1822
+
1815
1823
  ('submodules', ('array', {'type': 'it:dev:repo:commit'}), {
1816
- 'doc': "An array of other repos that this repo has as submodules, pinned at specific commits.",
1817
- }),
1824
+ 'doc': "An array of other repos that this repo has as submodules, pinned at specific commits."}),
1825
+
1818
1826
  )),
1819
1827
 
1820
1828
  ('it:dev:repo:remote', {}, (
@@ -1834,120 +1842,127 @@ class ItModule(s_module.CoreModule):
1834
1842
  )),
1835
1843
 
1836
1844
  ('it:dev:repo:branch', {}, (
1845
+
1837
1846
  ('parent', ('it:dev:repo:branch', {}), {
1838
- 'doc': 'The branch this branch was branched from.',
1839
- }),
1847
+ 'doc': 'The branch this branch was branched from.'}),
1848
+
1840
1849
  ('start', ('it:dev:repo:commit', {}), {
1841
- 'doc': 'The commit in the parent branch this branch was created at.'
1842
- }),
1850
+ 'doc': 'The commit in the parent branch this branch was created at.'}),
1851
+
1843
1852
  ('name', ('str', {'strip': True}), {
1844
- 'doc': 'The name of the branch.',
1845
- }),
1853
+ 'doc': 'The name of the branch.'}),
1854
+
1846
1855
  ('url', ('inet:url', {}), {
1847
- 'doc': 'The URL where the branch is hosted.',
1848
- }),
1856
+ 'doc': 'The URL where the branch is hosted.'}),
1857
+
1849
1858
  ('created', ('time', {}), {
1850
- 'doc': 'The time this branch was created',
1851
- }),
1859
+ 'deprecated': True,
1860
+ 'doc': 'Deprecated. Please use :period.'}),
1861
+
1852
1862
  ('merged', ('time', {}), {
1853
- 'doc': 'The time this branch was merged back into its parent.',
1854
- }),
1863
+ 'doc': 'The time this branch was merged back into its parent.'}),
1864
+
1855
1865
  ('deleted', ('time', {}), {
1856
- 'doc': 'The time this branch was deleted.',
1857
- }),
1866
+ 'deprecated': True,
1867
+ 'doc': 'Deprecated. Please use :period.'}),
1858
1868
  )),
1859
1869
 
1860
1870
  ('it:dev:repo:commit', {}, (
1861
1871
  ('repo', ('it:dev:repo', {}), {
1862
- 'doc': 'The repository the commit lives in.',
1863
- }),
1872
+ 'doc': 'The repository the commit lives in.'}),
1873
+
1864
1874
  ('parents', ('array', {'type': 'it:dev:repo:commit'}), {
1865
- 'doc': 'The commit or commits this commit is immediately based on.',
1866
- }),
1875
+ 'doc': 'The commit or commits this commit is immediately based on.'}),
1876
+
1867
1877
  ('branch', ('it:dev:repo:branch', {}), {
1868
- 'doc': 'The name of the branch the commit was made to.',
1869
- }),
1878
+ 'doc': 'The name of the branch the commit was made to.'}),
1879
+
1870
1880
  ('mesg', ('str', {}), {
1871
1881
  'disp': {'hint': 'text'},
1872
- 'doc': 'The commit message describing the changes in the commit.',
1873
- }),
1882
+ 'doc': 'The commit message describing the changes in the commit.'}),
1883
+
1874
1884
  ('id', ('str', {}), {
1875
- 'doc': 'The version control system specific commit identifier.',
1876
- }),
1885
+ 'doc': 'The version control system specific commit identifier.'}),
1886
+
1877
1887
  ('created', ('time', {}), {
1878
- 'doc': 'The time the commit was made.',
1879
- }),
1888
+ 'deprecated': True,
1889
+ 'doc': 'Deprecated. Please use :period.'}),
1890
+
1880
1891
  ('url', ('inet:url', {}), {
1881
- 'doc': 'The URL where the commit is hosted.',
1882
- }),
1892
+ 'doc': 'The URL where the commit is hosted.'}),
1883
1893
  )),
1884
1894
 
1885
1895
  ('it:dev:repo:diff', {}, (
1896
+
1886
1897
  ('commit', ('it:dev:repo:commit', {}), {
1887
- 'doc': 'The commit that produced this diff.',
1888
- }),
1898
+ 'doc': 'The commit that produced this diff.'}),
1899
+
1889
1900
  ('file', ('file:bytes', {}), {
1890
- 'doc': 'The file after the commit has been applied',
1891
- }),
1901
+ 'doc': 'The file after the commit has been applied'}),
1902
+
1892
1903
  ('path', ('file:path', {}), {
1893
- 'doc': 'The path to the file in the repo that the diff is being applied to.',
1894
- }),
1904
+ 'doc': 'The path to the file in the repo that the diff is being applied to.'}),
1905
+
1895
1906
  ('url', ('inet:url', {}), {
1896
- 'doc': 'The URL where the diff is hosted.',
1897
- }),
1907
+ 'doc': 'The URL where the diff is hosted.'}),
1898
1908
  )),
1899
1909
 
1900
1910
  ('it:dev:repo:issue', {}, (
1911
+
1901
1912
  ('repo', ('it:dev:repo', {}), {
1902
- 'doc': 'The repo where the issue was logged.',
1903
- }),
1913
+ 'doc': 'The repo where the issue was logged.'}),
1914
+
1904
1915
  ('title', ('str', {'lower': True, 'strip': True}), {
1905
- 'doc': 'The title of the issue.'
1906
- }),
1916
+ 'doc': 'The title of the issue.'}),
1917
+
1907
1918
  ('desc', ('str', {}), {
1908
1919
  'disp': {'hint': 'text'},
1909
- 'doc': 'The text describing the issue.'
1910
- }),
1920
+ 'doc': 'The text describing the issue.'}),
1921
+
1911
1922
  ('created', ('time', {}), {
1912
- 'doc': 'The time the issue was created.',
1913
- }),
1923
+ 'deprecated': True,
1924
+ 'doc': 'Deprecated. Please use :period.'}),
1925
+
1914
1926
  ('updated', ('time', {}), {
1915
- 'doc': 'The time the issue was updated.',
1916
- }),
1927
+ 'doc': 'The time the issue was updated.'}),
1928
+
1917
1929
  ('url', ('inet:url', {}), {
1918
- 'doc': 'The URL where the issue is hosted.',
1919
- }),
1930
+ 'doc': 'The URL where the issue is hosted.'}),
1931
+
1920
1932
  ('id', ('str', {'strip': True}), {
1921
- 'doc': 'The ID of the issue in the repository system.',
1922
- }),
1933
+ 'doc': 'The ID of the issue in the repository system.'}),
1923
1934
  )),
1924
1935
 
1925
1936
  ('it:dev:repo:label', {}, (
1937
+
1926
1938
  ('id', ('str', {'strip': True}), {
1927
- 'doc': 'The ID of the label.',
1928
- }),
1939
+ 'doc': 'The ID of the label.'}),
1940
+
1929
1941
  ('title', ('str', {'lower': True, 'strip': True}), {
1930
- 'doc': 'The human friendly name of the label.',
1931
- }),
1942
+ 'doc': 'The human friendly name of the label.'}),
1943
+
1932
1944
  ('desc', ('str', {}), {
1933
1945
  'disp': {'hint': 'text'},
1934
- 'doc': 'The description of the label.',
1935
- }),
1946
+ 'doc': 'The description of the label.'}),
1947
+
1936
1948
  )),
1937
1949
 
1938
1950
  ('it:dev:repo:issue:label', {}, (
1951
+
1939
1952
  ('issue', ('it:dev:repo:issue', {}), {
1940
- 'doc': 'The issue the label was applied to.',
1941
- }),
1953
+ 'doc': 'The issue the label was applied to.'}),
1954
+
1942
1955
  ('label', ('it:dev:repo:label', {}), {
1943
- 'doc': 'The label that was applied to the issue.',
1944
- }),
1956
+ 'doc': 'The label that was applied to the issue.'}),
1957
+
1945
1958
  ('applied', ('time', {}), {
1946
- 'doc': 'The time the label was applied.',
1947
- }),
1959
+ 'deprecated': True,
1960
+ 'doc': 'Deprecated. Please use :period.'}),
1961
+
1948
1962
  ('removed', ('time', {}), {
1949
- 'doc': 'The time the label was removed.',
1950
- }),
1963
+ 'deprecated': True,
1964
+ 'doc': 'Deprecated. Please use :period.'}),
1965
+
1951
1966
  )),
1952
1967
 
1953
1968
  ('it:dev:repo:issue:comment', {}, (
@@ -1965,7 +1980,8 @@ class ItModule(s_module.CoreModule):
1965
1980
  'doc': 'The URL where the comment is hosted.',
1966
1981
  }),
1967
1982
  ('created', ('time', {}), {
1968
- 'doc': 'The time the comment was created.',
1983
+ 'deprecated': True,
1984
+ 'doc': 'Deprecated. Please use :period.',
1969
1985
  }),
1970
1986
  ('updated', ('time', {}), {
1971
1987
  'doc': 'The time the comment was updated.',
@@ -1973,31 +1989,33 @@ class ItModule(s_module.CoreModule):
1973
1989
  )),
1974
1990
 
1975
1991
  ('it:dev:repo:diff:comment', {}, (
1992
+
1976
1993
  ('diff', ('it:dev:repo:diff', {}), {
1977
- 'doc': 'The diff the comment is being added to.',
1978
- }),
1994
+ 'doc': 'The diff the comment is being added to.'}),
1995
+
1979
1996
  ('text', ('str', {}), {
1980
1997
  'disp': {'hint': 'text'},
1981
- 'doc': 'The body of the comment.',
1982
- }),
1998
+ 'doc': 'The body of the comment.'}),
1999
+
1983
2000
  ('replyto', ('it:dev:repo:diff:comment', {}), {
1984
- 'doc': 'The comment that this comment is replying to.',
1985
- }),
2001
+ 'doc': 'The comment that this comment is replying to.'}),
2002
+
1986
2003
  ('line', ('int', {}), {
1987
- 'doc': 'The line in the file that is being commented on.',
1988
- }),
2004
+ 'doc': 'The line in the file that is being commented on.'}),
2005
+
1989
2006
  ('offset', ('int', {}), {
1990
- 'doc': 'The offset in the line in the file that is being commented on.',
1991
- }),
2007
+ 'doc': 'The offset in the line in the file that is being commented on.'}),
2008
+
1992
2009
  ('url', ('inet:url', {}), {
1993
- 'doc': 'The URL where the comment is hosted.',
1994
- }),
2010
+ 'doc': 'The URL where the comment is hosted.'}),
2011
+
1995
2012
  ('created', ('time', {}), {
1996
- 'doc': 'The time the comment was created.',
1997
- }),
2013
+ 'deprecated': True,
2014
+ 'doc': 'Deprecated. Please use :period.'}),
2015
+
1998
2016
  ('updated', ('time', {}), {
1999
- 'doc': 'The time the comment was updated.',
2000
- }),
2017
+ 'doc': 'The time the comment was updated.'}),
2018
+
2001
2019
  )),
2002
2020
 
2003
2021
  ('it:prod:hardwaretype', {}, ()),
synapse/models/person.py CHANGED
@@ -371,8 +371,11 @@ class PsModule(s_module.CoreModule):
371
371
  'doc': 'The listed org/company FQDN for this contact.',
372
372
  }),
373
373
  ('user', ('inet:user', {}), {
374
- 'doc': 'The username or handle for this contact.',
375
- }),
374
+ 'doc': 'The username or handle for this contact.'}),
375
+
376
+ ('service:accounts', ('array', {'type': 'inet:service:account', 'sorted': True, 'uniq': True}), {
377
+ 'doc': 'The service accounts associated with this contact.'}),
378
+
376
379
  ('web:acct', ('inet:web:acct', {}), {
377
380
  'doc': 'The social media account for this contact.',
378
381
  }),
synapse/models/telco.py CHANGED
@@ -378,6 +378,9 @@ class TelcoModule(s_module.CoreModule):
378
378
  ('email', ('inet:email', {}), {}),
379
379
  ('acct', ('inet:web:acct', {}), {}),
380
380
 
381
+ ('account', ('inet:service:account', {}), {
382
+ 'doc': 'The service account which is associated with the tracked device.'}),
383
+
381
384
  # reporting related data
382
385
  ('app', ('it:prod:softver', {}), {}),
383
386