@@ -21,6 +21,8 @@ _CONTENT_TYPES = (b'text/xml', b'application/text')
21
21
22
22
client = None
23
23
logger = logging .getLogger ()
24
+ gateway = None
25
+
24
26
25
27
class DTDResolver (etree .Resolver ):
26
28
def __init__ (self , * args , ** kwargs ):
@@ -34,15 +36,12 @@ class DTDResolver(etree.Resolver):
34
36
35
37
36
38
class Gateway (object ):
37
- _parser = None
38
-
39
- def __init__ (self ):
40
- if Gateway ._parser is None :
41
- parser = etree .XMLParser (load_dtd = False )
42
- parser .resolvers .add (DTDResolver ())
43
- Gateway ._parser = parser
39
+ def __init__ (self , validate_dtd = False ):
40
+ parser = etree .XMLParser (load_dtd = validate_dtd )
41
+ parser .resolvers .add (DTDResolver ())
42
+ self ._parser = parser
44
43
45
- def convert (self , body ):
44
+ def forward (self , body ):
46
45
roots = ('Alert' , 'Heartbeat' )
47
46
ad_types = ('boolean' , 'byte' , 'character' , 'date-time' , 'integer' ,
48
47
'ntpstamp' , 'portlist' , 'real' , 'string' , 'byte-string' ,
@@ -55,7 +54,7 @@ class Gateway(object):
55
54
special_content .update (dict .fromkeys (ad_types , 'data' ))
56
55
ignored_attrs = ('ntpstamp' , )
57
56
58
- xml = etree .fromstring (body , parser = Gateway ._parser )
57
+ xml = etree .fromstring (body , parser = self ._parser )
59
58
stack = []
60
59
indices = []
61
60
idmef = None
@@ -148,13 +147,15 @@ class Gateway(object):
148
147
149
148
150
149
def app (environ , start_response ):
150
+ global gateway
151
+
151
152
if environ .get ('CONTENT_TYPE' ) not in _CONTENT_TYPES :
152
153
start_response (b'415 Unsupported Media Type' , [(b'Content-Type' , b'text/plain' )])
153
154
return (b'Wrong media type\n ' )
154
155
155
156
try :
156
157
remote = cgi .FieldStorage (environ ['wsgi.input' ], environ = environ )
157
- Gateway (). convert (remote .value )
158
+ gateway . forward (remote .value )
158
159
start_response (b'200 OK' , [(b'Content-Type' , b'text/plain' )])
159
160
return (b'OK\n ' )
160
161
except Exception as e :
@@ -165,13 +166,14 @@ def app(environ, start_response):
165
166
166
167
if __name__ == "__main__" :
167
168
parser = argparse .ArgumentParser (description = "IDMEF to Prelude web gateway" )
169
+ parser .add_argument ('--debug' , help = "Enable debugging logs." , default = False , action = 'store_true' )
170
+ parser .add_argument ('--dry-run' , '-n' , help = "Do not actually forward the messages." , dest = 'dry_run' , action = 'store_true' )
168
171
parser .add_argument ('--profile' , help = "Prelude profile to use." , default = "secef" )
169
172
parser .add_argument ('--sock' , '-s' , help = "Path to the gateway's UNIX socket." , default = FCGI_SOCK )
170
- parser .add_argument ('--debug' , help = "Enable debugging logs." , default = False , action = 'store_true' )
171
- parser .add_argument ('--dry-run' , '-n' , help = "Do not actually forward the messages." ,
172
- dest = 'dry_run' , action = 'store_true' )
173
+ parser .add_argument ('--valid-dtd' , help = "Perform DTD validation." , dest = 'valid_dtd' , action = 'store_true' )
173
174
args = parser .parse_args ()
174
175
logging .basicConfig (stream = sys .stdout , level = logging .DEBUG if args .debug else logging .INFO )
176
+ gateway = Gateway (validate_dtd = bool (args .valid_dtd ))
175
177
176
178
if not args .dry_run :
177
179
client = prelude .ClientEasy (args .profile , prelude .ClientEasy .PERMISSION_IDMEF_WRITE ,
0 commit comments