- Improved error handling: any Scyther errors now raise an exception.
This can be dealt with accordingly. If no error occurs, we can just nicely assume the output is a claim list or something similar.
This commit is contained in:
parent
6cd4d3d7b6
commit
70a718807e
@ -60,7 +60,12 @@ class ScytherThread(threading.Thread):
|
||||
scyther.setInput(self.spdl)
|
||||
|
||||
# verification start
|
||||
claims = scyther.verify()
|
||||
try:
|
||||
claims = scyther.verify()
|
||||
except Scyther.Error.ScytherError, el:
|
||||
claims = None
|
||||
pass
|
||||
|
||||
summary = str(scyther)
|
||||
|
||||
return (scyther, claims, summary)
|
||||
|
@ -9,6 +9,22 @@ class Error(Exception):
|
||||
"""Base class for exceptions in this module."""
|
||||
pass
|
||||
|
||||
class ScytherError(Error):
|
||||
"""Exception raised for errors generated by the backend
|
||||
|
||||
Attributes:
|
||||
errorlist -- list of error lines are retrieved from the
|
||||
backend
|
||||
"""
|
||||
|
||||
def __init__(self, errorlist):
|
||||
self.errorlist = errorlist
|
||||
|
||||
def __str__(self):
|
||||
s = "Scyther backend reported the following errors:\n"
|
||||
s = s + "\n".join(self.errorlist)
|
||||
return s
|
||||
|
||||
class InputError(Error):
|
||||
"""Exception raised for errors in the input.
|
||||
|
||||
|
@ -193,9 +193,9 @@ class Scyther(object):
|
||||
raise Error.NoBinaryError
|
||||
|
||||
# Sanitize input somewhat
|
||||
if not spdl or spdl == "":
|
||||
if spdl == "":
|
||||
# Scyther hickups on completely empty input
|
||||
spdl = None
|
||||
spdl = "\n"
|
||||
|
||||
# Generate temporary files for the output.
|
||||
# Requires Python 2.3 though.
|
||||
@ -275,19 +275,22 @@ class Scyther(object):
|
||||
self.warnings = []
|
||||
for l in errors.splitlines():
|
||||
line = l.strip()
|
||||
# filter out any non-errors (say maybe only claim etc) and count
|
||||
# them.
|
||||
if line.startswith("claim\t"):
|
||||
# Claims are lost, reconstructed from the XML output
|
||||
continue
|
||||
if line.startswith("warning"):
|
||||
# Warnings are stored seperately
|
||||
self.warnings.append(line)
|
||||
continue
|
||||
# otherwise it is an error
|
||||
self.errors.append(line)
|
||||
if len(line) > 0:
|
||||
# filter out any non-errors (say maybe only claim etc) and count
|
||||
# them.
|
||||
if line.startswith("claim\t"):
|
||||
# Claims are lost, reconstructed from the XML output
|
||||
continue
|
||||
if line.startswith("warning"):
|
||||
# Warnings are stored seperately
|
||||
self.warnings.append(line)
|
||||
continue
|
||||
# otherwise it is an error
|
||||
self.errors.append(line)
|
||||
|
||||
self.errorcount = len(self.errors)
|
||||
if self.errorcount > 0:
|
||||
raise Error.ScytherError(self.errors)
|
||||
|
||||
# process output
|
||||
self.output = output
|
||||
@ -310,14 +313,19 @@ class Scyther(object):
|
||||
else:
|
||||
return self.output
|
||||
|
||||
def verifyOne(self,cl):
|
||||
def verifyOne(self,cl=None):
|
||||
"""
|
||||
Verify just a single claim with an ID retrieved from the
|
||||
procedure below, 'scanClaims', or a full claim object
|
||||
"""
|
||||
if isinstance(cl,Claim.Claim):
|
||||
cl = cl.id
|
||||
return self.verify("--filter=%s" % cl)
|
||||
if cl:
|
||||
# We accept either a claim or a claim id
|
||||
if isinstance(cl,Claim.Claim):
|
||||
cl = cl.id
|
||||
return self.verify("--filter=%s" % cl)
|
||||
else:
|
||||
# If no claim, then its just normal verification
|
||||
return self.verify()
|
||||
|
||||
def scanClaims(self):
|
||||
"""
|
||||
|
23
gui/mpa.py
23
gui/mpa.py
@ -8,9 +8,11 @@ Scyther Python API (contained in the Scyther subdirectory)
|
||||
In this example, multi-protocol attack analysis is performed on a small
|
||||
test set.
|
||||
|
||||
Author: Cas Cremers
|
||||
|
||||
"""
|
||||
|
||||
import Scyther.Scyther as Scyther
|
||||
from Scyther import Scyther
|
||||
|
||||
def MyScyther(protocollist,filter=None):
|
||||
"""
|
||||
@ -19,12 +21,11 @@ def MyScyther(protocollist,filter=None):
|
||||
will be evaluated.
|
||||
"""
|
||||
s = Scyther.Scyther()
|
||||
# untyped matching
|
||||
s.options = "--match=2"
|
||||
if filter:
|
||||
s.options += " --filter=%s" % (filter)
|
||||
for protocol in protocollist:
|
||||
s.addFile(protocol)
|
||||
s.verify()
|
||||
s.verifyOne(filter)
|
||||
return s
|
||||
|
||||
|
||||
@ -42,11 +43,10 @@ def getCorrectIsolatedClaims(protocolset):
|
||||
# verify protocol in isolation
|
||||
s = MyScyther([protocol])
|
||||
# investigate the results
|
||||
if not s.errors:
|
||||
goodprotocols.append(protocol)
|
||||
for claim in s.claims:
|
||||
if claim.okay:
|
||||
correctclaims.append((protocol,claim.id))
|
||||
goodprotocols.append(protocol)
|
||||
for claim in s.claims:
|
||||
if claim.okay:
|
||||
correctclaims.append((protocol,claim.id))
|
||||
return (goodprotocols,correctclaims)
|
||||
|
||||
def verifyMPAlist(mpalist,claimid):
|
||||
@ -124,7 +124,7 @@ def findAllMPA(protocolset,maxcount=3):
|
||||
findMPA(protocolset,protocol,claimid,maxcount=3)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
def main():
|
||||
"""
|
||||
Simple test case with a few protocols
|
||||
"""
|
||||
@ -137,5 +137,8 @@ if __name__ == '__main__':
|
||||
print "Analysis complete."
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
|
||||
|
||||
# vim: set ts=4 sw=4 et list lcs=tab\:>-:
|
||||
|
@ -24,11 +24,8 @@ from optparse import OptionParser, SUPPRESS_HELP
|
||||
#---------------------------------------------------------------------------
|
||||
|
||||
""" Import scyther-gui components """
|
||||
import Gui.About as About
|
||||
import Gui.Preference as Preference
|
||||
import Gui.Mainwindow as Mainwindow
|
||||
import Gui.Misc as Misc
|
||||
import Scyther.Scyther as Scyther
|
||||
from Gui import About,Preference,Mainwindow,Misc
|
||||
from Scyther import Scyther
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user