Example #1
0
def installmtz(package, prefix):
    try:
        src = resource_filename('%s.resources.maltego' % package, 'entities.mtz')
        if not os.path.exists(src):
            return
        prefix = os.path.join(prefix, 'config', 'Maltego', 'Entities')
        z = ZipFile(src)
        entities = filter(lambda x: x.endswith('.entity'), z.namelist())

        for e in entities:
            data = z.open(e).read()
            xml = XML(data)
            category = xml.get('category')
            catdir = os.path.join(prefix, category)
            if not os.path.exists(catdir):
                os.mkdir(catdir)
            p = os.path.join(catdir, os.path.basename(e))
            print 'Installing entity %s to %s...' % (e, p)
            with open(p, 'wb') as f:
                f.write(data)
    except ImportError:
        pass
Example #2
0
def installmtz(package, prefix):
    try:
        src = resource_filename("%s.resources.maltego" % package, "entities.mtz")
        if not os.path.exists(src):
            return
        prefix = os.path.join(prefix, "config", "Maltego", "Entities")
        z = ZipFile(src)
        entities = filter(lambda x: x.endswith(".entity"), z.namelist())

        for e in entities:
            data = z.open(e).read()
            xml = XML(data)
            category = xml.get("category")
            catdir = os.path.join(prefix, category)
            if not os.path.exists(catdir):
                os.mkdir(catdir)
            p = os.path.join(catdir, os.path.basename(e))
            print "Installing entity %s to %s..." % (e, p)
            with open(p, "wb") as f:
                f.write(data)
    except ImportError:
        pass
Example #3
0
def installmtz(package, prefix):
    try:
        src = resource_filename('%s.resources.maltego' % package,
                                'entities.mtz')
        if not os.path.exists(src):
            return
        prefix = os.path.join(prefix, 'config', 'Maltego', 'Entities')
        z = ZipFile(src)
        entities = filter(lambda x: x.endswith('.entity'), z.namelist())

        for e in entities:
            data = z.open(e).read()
            xml = XML(data)
            category = xml.get('category')
            catdir = os.path.join(prefix, category)
            if not os.path.exists(catdir):
                os.mkdir(catdir)
            p = os.path.join(catdir, os.path.basename(e))
            print 'Installing entity %s to %s...' % (e, p)
            with open(p, 'wb') as f:
                f.write(data)
    except ImportError:
        pass
Example #4
0
def run(args):
    opts = parse_args(args)

    if path.exists(opts.outfile) and not opts.append and not \
        parse_bool('%s already exists. Are you sure you want to overwrite it? [y/N]: ' % repr(opts.outfile),
                   default='n'):
        exit(-1)

    entity_source = None
    if opts.mtz_file is None:
        d = detect_settings_dir()
        if maltego_version(d) >= '3.4.0':
            print("""
=========================== ERROR: NOT SUPPORTED ===========================

 Starting from Maltego v3.4.0 the 'canari generate-entities' command can no
 longer generate entity definition files from the Maltego configuration
 directory. Entities can only be generated from export files (*.mtz). To
 export entities navigate to the 'Manage' tab in Maltego, then click on the
 'Export Entities' button and follow the prompts. Once the entities have
 been exported, run the following command:

 shell> canari generate-entities -m myentities.mtz

=========================== ERROR: NOT SUPPORTED ===========================
                """)
            exit(-1)
        entity_source = DirFile(
            path.join(d, 'config', 'Maltego', 'Entities')
        )
    else:
        entity_source = ZipFile(opts.mtz_file)

    entity_files = filter(lambda x: x.endswith('.entity'), entity_source.namelist())

    namespaces = dict()

    excluded_entities = []
    if opts.append:
        existing_entities = get_existing_entities(opts.outfile)
        # excluded_entities.extend([e._type_ for e in existing_entities])
        for entity_class in existing_entities:
            excluded_entities.extend(entity_class._type_)
            if entity_class._type_.endswith('Entity'):
                namespaces[entity_class._namespace_] = entity_class.__name__

    print 'Generating %s...' % repr(opts.outfile)
    outfile = open(opts.outfile, 'ab' if opts.append else 'wb')

    if opts.append:
        outfile.write('\n\n')
    else:
        outfile.write('#!/usr/bin/env python\n\nfrom canari.maltego.entities import EntityField, Entity\n\n\n')

    for entity_file in entity_files:
        xml = XML(entity_source.open(entity_file).read())
        id_ = xml.get('id')

        if (opts.entity and id_ not in opts.entity) or id_ in excluded_entities:
            continue

        namespace_entity = id_.split('.')

        base_classname = None
        namespace = '.'.join(namespace_entity[:-1])
        name = namespace_entity[-1]
        classname = name

        if (opts.namespace and namespace not in opts.namespace) or namespace in opts.exclude_namespace:
            continue

        if namespace not in namespaces:
            base_classname = '%sEntity' % (''.join([n.title() for n in namespace_entity[:-1]]))
            namespaces[namespace] = base_classname

            outfile.write('class %s(Entity):\n    _namespace_ = %s\n\n' % (base_classname, repr(namespace)))
        else:
            base_classname = namespaces[namespace]

        for field in xml.findall('Properties/Fields/Field'):
            fields = [
                'name=%s' % repr(field.get('name')),
                'propname=%s' % repr(normalize_fn(field.get('name'))),
                'displayname=%s' % repr(field.get('displayName'))

            ]
            outfile.write('@EntityField(%s)\n' % ', '.join(fields))

        outfile.write('class %s(%s):\n    pass\n\n\n' % (classname, base_classname))

    outfile.close()
    print 'done.'
Example #5
0
from sys import argv
 
zip = ZipFile(argv[1])
entities = filter(lambda x: x.endswith('.entity'), zip.namelist())
 
 
def normalize_fn(fn):
    # Get rid of starting underscores or numbers and bad chars for var names in python
    return sub(r'[^A-Za-z0-9]', '', sub(r'^[^A-Za-z]+', '', fn))
 
 
nses = dict()
 
for e in entities:
    xml = XML(zip.open(e).read())
    id_ = xml.get('id')
 
    ens = id_.split('.')
 
    base_classname = None
    namespace = '.'.join(ens[:-1])
    name = ens[-1]
    classname = name
 
    if namespace not in nses:
        base_classname = '%sEntity' % (''.join([ n.title() for n in ens[:-1] ]))
        nses[namespace] = base_classname
 
        print 'class %s(Entity):\n    namespace = %s\n\n' % (base_classname, repr(namespace))
    else:
        base_classname = nses[namespace]
Example #6
0
from sys import argv

zip = ZipFile(argv[1])
entities = filter(lambda x: x.endswith('.entity'), zip.namelist())


def normalize_fn(fn):
    # Get rid of starting underscores or numbers and bad chars for var names in python
    return sub(r'[^A-Za-z0-9]', '', sub(r'^[^A-Za-z]+', '', fn))


nses = dict()

for e in entities:
    xml = XML(zip.open(e).read())
    id_ = xml.get('id')

    ens = id_.split('.')

    base_classname = None
    namespace = '.'.join(ens[:-1])
    name = ens[-1]
    classname = name

    if namespace not in nses:
        base_classname = '%sEntity' % (''.join([n.title() for n in ens[:-1]]))
        nses[namespace] = base_classname

        print 'class %s(Entity):\n    namespace = %s\n\n' % (base_classname,
                                                             repr(namespace))
    else:
Example #7
0
def run(args):

    opts = parse_args(args)

    if path.exists(opts.outfile) and not opts.append and not \
       parse_bool('%s already exists. Are you sure you want to overwrite it? [y/N]: ' % repr(opts.outfile), default='n'):
        exit(-1)


    ar = DirFile(
        path.join(detect_settings_dir(), 'config', 'Maltego', 'Entities')
    ) if opts.mtz_file is None else ZipFile(opts.mtz_file)

    entities = filter(lambda x: x.endswith('.entity'), ar.namelist())

    nses = dict()

    el = []
    if opts.append:
        l = diff(opts.outfile)
        el.extend([i.type for i in l])
        for i in l:
            if i.type.endswith('Entity'):
                nses[i.namespace] = i.__class__.__name__

    print 'Generating %s...' % repr(opts.outfile)
    fd = open(opts.outfile, 'ab' if opts.append else 'wb')

    if opts.append:
        fd.write('\n\n')
    else:
        fd.write('#!/usr/bin/env python\n\nfrom canari.maltego.entities import EntityField, Entity\n\n\n')

    for e in entities:
        xml = XML(ar.open(e).read())
        id_ = xml.get('id')

        if (opts.entity and id_ not in opts.entity) or id_ in el:
            continue

        ens = id_.split('.')

        base_classname = None
        namespace = '.'.join(ens[:-1])
        name = ens[-1]
        classname = name

        if (opts.namespace and namespace not in opts.namespace) or namespace in opts.exclude_namespace:
            continue

        if namespace not in nses:
            base_classname = '%sEntity' % (''.join([ n.title() for n in ens[:-1] ]))
            nses[namespace] = base_classname

            fd.write('class %s(Entity):\n    namespace = %s\n\n' % (base_classname, repr(namespace)))
        else:
            base_classname = nses[namespace]


        for f in xml.findall('Properties/Fields/Field'):
            fields = [
                'name=%s' % repr(f.get('name')),
                'propname=%s' % repr(normalize_fn(f.get('name'))),
                'displayname=%s' % repr(f.get('displayName'))

            ]
            fd.write('@EntityField(%s)\n' % ', '.join(fields))

        fd.write('class %s(%s):\n    pass\n\n\n' % (classname, base_classname))

    fd.close()
    print 'done.'
Example #8
0
def run(args):
    opts = parse_args(args)

    if path.exists(opts.outfile) and not opts.append and not \
        parse_bool('%s already exists. Are you sure you want to overwrite it? [y/N]: ' % repr(opts.outfile),
                   default='n'):
        exit(-1)

    entity_source = None
    if opts.mtz_file is None:
        d = detect_settings_dir()
        if maltego_version(d) >= '3.4.0':
            print("""
=========================== ERROR: NOT SUPPORTED ===========================

 Starting from Maltego v3.4.0 the 'canari generate-entities' command can no
 longer generate entity definition files from the Maltego configuration
 directory. Entities can only be generated from export files (*.mtz). To
 export entities navigate to the 'Manage' tab in Maltego, then click on the
 'Export Entities' button and follow the prompts. Once the entities have
 been exported, run the following command:

 shell> canari generate-entities -m myentities.mtz

=========================== ERROR: NOT SUPPORTED ===========================
                """)
            exit(-1)
        entity_source = DirFile(path.join(d, 'config', 'Maltego', 'Entities'))
    else:
        entity_source = ZipFile(opts.mtz_file)

    entity_files = filter(lambda x: x.endswith('.entity'),
                          entity_source.namelist())

    namespaces = dict()

    excluded_entities = []
    if opts.append:
        existing_entities = get_existing_entities(opts.outfile)
        # excluded_entities.extend([e._type_ for e in existing_entities])
        for entity_class in existing_entities:
            excluded_entities.extend(entity_class._type_)
            if entity_class._type_.endswith('Entity'):
                namespaces[entity_class._namespace_] = entity_class.__name__

    print 'Generating %s...' % repr(opts.outfile)
    outfile = open(opts.outfile, 'ab' if opts.append else 'wb')

    if opts.append:
        outfile.write('\n\n')
    else:
        outfile.write(
            '#!/usr/bin/env python\n\nfrom canari.maltego.entities import EntityField, Entity\n\n\n'
        )

    for entity_file in entity_files:
        xml = XML(entity_source.open(entity_file).read())
        id_ = xml.get('id')

        if (opts.entity
                and id_ not in opts.entity) or id_ in excluded_entities:
            continue

        namespace_entity = id_.split('.')

        base_classname = None
        namespace = '.'.join(namespace_entity[:-1])
        name = namespace_entity[-1]
        classname = name

        if (opts.namespace and namespace
                not in opts.namespace) or namespace in opts.exclude_namespace:
            continue

        if namespace not in namespaces:
            base_classname = '%sEntity' % (''.join(
                [n.title() for n in namespace_entity[:-1]]))
            namespaces[namespace] = base_classname

            outfile.write('class %s(Entity):\n    _namespace_ = %s\n\n' %
                          (base_classname, repr(namespace)))
        else:
            base_classname = namespaces[namespace]

        for field in xml.findall('Properties/Fields/Field'):
            fields = [
                'name=%s' % repr(field.get('name')),
                'propname=%s' % repr(normalize_fn(field.get('name'))),
                'displayname=%s' % repr(field.get('displayName'))
            ]
            outfile.write('@EntityField(%s)\n' % ', '.join(fields))

        outfile.write('class %s(%s):\n    pass\n\n\n' %
                      (classname, base_classname))

    outfile.close()
    print 'done.'