11from datetime import datetime
2+
23import json as _json
4+ import dateutil .parser
5+
6+ def parse_date (datestr ):
7+ """ Parses an ISO 8601 formatted date from Gophish """
8+ return dateutil .parser .parse (datestr )
39
410class Model (object ):
511 def __init__ (self ):
@@ -51,36 +57,31 @@ class Result(Model):
5157 'position' : None , 'ip' : None , 'latitude' : None , 'longitude' : None ,
5258 'status' : None }
5359
54- def __init__ (** kwargs ):
60+ def __init__ (self , ** kwargs ):
5561 for key , default in Result .__valid_properties .items ():
5662 setattr (self , key , kwargs .get (key , default ))
5763
5864 @classmethod
5965 def parse (cls , json ):
60- raise NotImplementedError
66+ result = cls ()
67+ for key , val in json .items ():
68+ if key in cls .__valid_properties :
69+ setattr (result , key , val )
6170
6271
6372class TimelineEntry (object ):
64- __valid_properties = ['email' , 'time' , 'message' , 'details' ]
65-
66- def __init__ (entry ):
67- for key , default in TimelineEntry .__valid_properties .items ():
68- setattr (self , key , kwargs .get (key , default ))
73+ __valid_properties = {'email' : None , 'time' : None , 'message' : None , 'details' : None }
6974
7075 @classmethod
7176 def parse (cls , json ):
7277 entry = cls ()
7378 for key , val in json .items ():
74- if key == 'details' :
79+ if key == 'details' and val != "" :
7580 details = _json .loads (val )
7681 setattr (entry , key , details )
7782 elif key in cls .__valid_properties :
7883 setattr (entry , key , val )
7984
80- @classmethod
81- def parse (cls , json ):
82- raise NotImplementedError
83-
8485
8586class User (Model ):
8687 """ User contains the attributes for a member of a group
@@ -89,7 +90,7 @@ class User(Model):
8990 'id' : None , 'first_name' : None , 'last_name' : None , 'email' : None ,
9091 'position' : None }
9192
92- def __init__ (** kwargs ):
93+ def __init__ (self , ** kwargs ):
9394 for key , default in User .__valid_properties .items ():
9495 setattr (self , key , kwargs .get (key , default ))
9596
@@ -104,7 +105,7 @@ class Group(Model):
104105 'id' : None , 'name' : None , 'modified_date' : datetime .now (),
105106 'targets' : []}
106107
107- def __init__ (** kwargs ):
108+ def __init__ (self , ** kwargs ):
108109 for key , default in Group .__valid_properties .items ():
109110 setattr (self , key , kwargs .get (key , default ))
110111
@@ -117,7 +118,7 @@ def parse(cls, json):
117118 setattr (group , key , users )
118119 elif key == 'modified_date' :
119120 setattr (group , key , parse_date (val ))
120- elif key in Group .__valid_properties :
121+ elif key in cls .__valid_properties :
121122 setattr (group , key , val )
122123 return group
123124
@@ -128,7 +129,7 @@ class SMTP(Model):
128129 'from_address' : None , 'ignore_cert_errors' : False ,
129130 'modified_date' : datetime .now ()}
130131
131- def __init__ (** kwargs ):
132+ def __init__ (self , ** kwargs ):
132133 for key , default in SMTP .__valid_properties .items ():
133134 setattr (self , key , kwargs .get (key , default ))
134135
@@ -138,7 +139,7 @@ def parse(cls, json):
138139 for key , val in json .items ():
139140 if key == 'modified_date' :
140141 setattr (smtp , key , parse_date (val ))
141- elif key in SMTP .__valid_properties :
142+ elif key in cls .__valid_properties :
142143 setattr (smtp , key , val )
143144 return smtp
144145
@@ -148,7 +149,7 @@ class Template(Model):
148149 'id' : None , 'name' : None , 'text' : None , 'html' : None ,
149150 'modified_date' : datetime .now (), 'subject' : None , 'attachments' : []}
150151
151- def __init__ (** kwargs ):
152+ def __init__ (self , ** kwargs ):
152153 for key , default in Template .__valid_properties .items ():
153154 setattr (self , key , kwargs .get (key , default ))
154155
@@ -162,7 +163,7 @@ def parse(cls, json):
162163 attachments = [
163164 Attachment .parse (attachment ) for attachment in val ]
164165 setattr (template , key , attachments )
165- elif key in Template .__valid_properties :
166+ elif key in cls .__valid_properties :
166167 setattr (template , key , val )
167168
168169
@@ -172,7 +173,7 @@ class Page(Model):
172173 'capture_credentials' : False , 'capture_passwords' : False ,
173174 'redirect_url' : None }
174175
175- def __init__ (** kwargs ):
176+ def __init__ (self , ** kwargs ):
176177 for key , default in Page .__valid_properties .items ():
177178 setattr (self , key , kwargs .get (key , default ))
178179
@@ -182,5 +183,22 @@ def parse(cls, json):
182183 for key , val in json .items ():
183184 if key == 'modified_date' :
184185 setattr (page , key , parse_date (val ))
185- elif key in Page .__valid_properties :
186+ elif key in cls .__valid_properties :
186187 setattr (page , key , val )
188+
189+ class Attachment (Model ):
190+ __valid_properties = {}
191+
192+ @classmethod
193+ def parse (cls , json ):
194+ return cls ()
195+
196+ class Error (Model ):
197+ __valid_properties = {'message' , 'success' , 'data' }
198+
199+ @classmethod
200+ def parse (cls , json ):
201+ error = cls ()
202+ for key , val in json .items ():
203+ if key in cls .__valid_properties :
204+ setattr (error , key , val )
0 commit comments