def run(args): [transform, params, value, fields] = parseargs(['canari %s' % cmd_name(__name__)] + args) transform_module = None fix_binpath(config['default/path']) try: transform_module = import_transform(transform) if os.name == 'posix' and hasattr(transform_module.dotransform, 'privileged') and os.geteuid(): rc = sudo(sys.argv) if rc == 1: message(MaltegoTransformResponseMessage() + UIMessage('User cancelled transform.')) elif rc == 2: message(MaltegoTransformResponseMessage() + UIMessage('Too many incorrect password attempts.')) elif rc: message(MaltegoTransformResponseMessage() + UIMessage('Unknown error occurred.')) exit(0) if hasattr(transform_module, 'onterminate'): onterminate(transform_module.onterminate) else: transform_module.__setattr__('onterminate', lambda *args: exit(-1)) input_entity = to_entity(guess_entity_type(transform_module, fields), value, fields) msg = transform_module.dotransform( MaltegoTransformRequestMessage(value, fields, params, input_entity), MaltegoTransformResponseMessage()) if get_transform_version( transform_module.dotransform ) == 2 else transform_module.dotransform( MaltegoTransformRequestMessage(value, fields, params, input_entity), MaltegoTransformResponseMessage(), config) if isinstance(msg, MaltegoTransformResponseMessage): message(msg) elif isinstance(msg, basestring): raise MaltegoException(msg) else: raise MaltegoException( 'Could not resolve message type returned by transform.') except MaltegoException, me: croak(str(me))
def dotransform(self, transform, valid_input_entity_types): try: if 'Content-Length' not in self.headers: self.send_error(500, 'What?') return request_str = self.rfile.read(int(self.headers['Content-Length'])) xml = fromstring(request_str).find( 'MaltegoTransformRequestMessage') e = xml.find('Entities/Entity') entity_type = e.get('Type', '') if valid_input_entity_types and entity_type not in valid_input_entity_types: self.send_error(400, 'Unsupported input entity!') return value = e.find('Value').text or '' fields = dict([ (f.get('Name', ''), f.text) for f in xml.findall('Entities/Entity/AdditionalFields/Field') ]) params = dict([(f.get('Name', ''), f.text) for f in xml.findall('TransformFields/Field')]) for k, i in params.items(): if '.' in k: config[k.replace('.', '/', 1)] = i else: config['default/%s' % k] = i limits = xml.find('Limits').attrib msg = transform( MaltegoTransformRequestMessage(value, fields, params, limits), request_str if hasattr(transform, 'cmd') and callable( transform.cmd) else MaltegoTransformResponseMessage() ) if get_transform_version(transform) == 2 else transform( MaltegoTransformRequestMessage(value, fields, params, limits), request_str if hasattr(transform, 'cmd') and callable(transform.cmd) else MaltegoTransformResponseMessage(), config) if isinstance(msg, MaltegoTransformResponseMessage) or isinstance( msg, basestring): message(msg, self) return else: raise MaltegoException( 'Could not resolve message type returned by transform.') except MaltegoException, me: croak(str(me), self)
def dotransform(self, transform, valid_input_entity_types): try: if 'Content-Length' not in self.headers: self.send_error(500, 'What?') return request_str = self.rfile.read(int(self.headers['Content-Length'])) xml = fromstring(request_str).find('MaltegoTransformRequestMessage') e = xml.find('Entities/Entity') entity_type = e.get('Type', '') if valid_input_entity_types and entity_type not in valid_input_entity_types: self.send_error(400, 'Unsupported input entity!') return value = e.find('Value').text or '' fields = dict([(f.get('Name', ''), f.text) for f in xml.findall('Entities/Entity/AdditionalFields/Field')]) params = dict([(f.get('Name', ''), f.text) for f in xml.findall('TransformFields/Field')]) for k, i in params.items(): if '.' in k: config[k.replace('.', '/', 1)] = i else: config['default/%s' % k] = i limits = xml.find('Limits').attrib msg = transform( MaltegoTransformRequestMessage(value, fields, params, limits), request_str if hasattr(transform, 'cmd') and callable(transform.cmd) else MaltegoTransformResponseMessage() ) if get_transform_version(transform) == 2 else transform( MaltegoTransformRequestMessage(value, fields, params, limits), request_str if hasattr(transform, 'cmd') and callable(transform.cmd) else MaltegoTransformResponseMessage(), config ) if isinstance(msg, MaltegoTransformResponseMessage) or isinstance(msg, basestring): message(msg, self) return else: raise MaltegoException('Could not resolve message type returned by transform.') except MaltegoException, me: croak(str(me), self)
def run(args): [transform, params, value, fields] = parseargs(['canari %s' % cmd_name(__name__)] + args) transform_module = None fix_binpath(config['default/path']) try: transform_module = import_transform(transform) if os.name == 'posix' and hasattr(transform_module.dotransform, 'privileged') and os.geteuid(): rc = sudo(sys.argv) if rc == 1: message(MaltegoTransformResponseMessage() + UIMessage('User cancelled transform.')) elif rc == 2: message(MaltegoTransformResponseMessage() + UIMessage('Too many incorrect password attempts.')) elif rc: message(MaltegoTransformResponseMessage() + UIMessage('Unknown error occurred.')) exit(0) if hasattr(transform_module, 'onterminate'): onterminate(transform_module.onterminate) else: transform_module.__setattr__('onterminate', lambda *args: exit(-1)) input_entity = to_entity(guess_entity_type(transform_module, fields), value, fields) msg = transform_module.dotransform( MaltegoTransformRequestMessage(value, fields, params, input_entity), MaltegoTransformResponseMessage() ) if get_transform_version(transform_module.dotransform) == 2 else transform_module.dotransform( MaltegoTransformRequestMessage(value, fields, params, input_entity), MaltegoTransformResponseMessage(), config ) if isinstance(msg, MaltegoTransformResponseMessage): message(msg) elif isinstance(msg, basestring): raise MaltegoException(msg) else: raise MaltegoException('Could not resolve message type returned by transform.') except MaltegoException, me: croak(str(me))