From ed70a0bacfdca738ba29d50e9f1b02290f28b9b8 Mon Sep 17 00:00:00 2001
From: Cyrille Bagard <nocbos@gmail.com>
Date: Sat, 28 May 2016 14:57:34 +0200
Subject: Removed the old Python plugin reading android permissions.

---
 ChangeLog                               |  24 +++
 configure.ac                            |   1 -
 plugins/python/Makefile.am              |   2 +-
 plugins/python/androperms/Makefile.am   |  23 ---
 plugins/python/androperms/__init__.py   |   2 -
 plugins/python/androperms/android.png   | Bin 1102 -> 0 bytes
 plugins/python/androperms/androperms.py |  89 ---------
 plugins/python/androperms/db.py         |  94 ---------
 plugins/python/androperms/defs.py       |  53 ------
 plugins/python/androperms/manifest.py   |  75 --------
 plugins/python/androperms/panel.py      | 125 ------------
 plugins/python/androperms/parser.py     | 328 --------------------------------
 plugins/python/androperms/reader.py     |  41 ----
 plugins/python/androperms/routine.png   | Bin 568 -> 0 bytes
 plugins/python/androperms/stack.py      | 108 -----------
 plugins/python/androperms/string.py     |  82 --------
 16 files changed, 25 insertions(+), 1022 deletions(-)
 delete mode 100644 plugins/python/androperms/Makefile.am
 delete mode 100644 plugins/python/androperms/__init__.py
 delete mode 100644 plugins/python/androperms/android.png
 delete mode 100644 plugins/python/androperms/androperms.py
 delete mode 100644 plugins/python/androperms/db.py
 delete mode 100644 plugins/python/androperms/defs.py
 delete mode 100644 plugins/python/androperms/manifest.py
 delete mode 100644 plugins/python/androperms/panel.py
 delete mode 100644 plugins/python/androperms/parser.py
 delete mode 100644 plugins/python/androperms/reader.py
 delete mode 100644 plugins/python/androperms/routine.png
 delete mode 100644 plugins/python/androperms/stack.py
 delete mode 100644 plugins/python/androperms/string.py

diff --git a/ChangeLog b/ChangeLog
index adb58a5..444dbb0 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,27 @@
+16-05-28  Cyrille Bagard <nocbos@gmail.com>
+
+	* configure.ac:
+	Remove the Makefile from the 'plugins/python/androperms' directory.
+
+	* plugins/python/Makefile.am:
+	Remove androperms from SUBDIRS. Remove the old Python plugin reading
+	android permissions.
+
+	* plugins/python/androperms/Makefile.am:
+	* plugins/python/androperms/__init__.py:
+	* plugins/python/androperms/android.png:
+	* plugins/python/androperms/androperms.py:
+	* plugins/python/androperms/db.py:
+	* plugins/python/androperms/defs.py:
+	* plugins/python/androperms/manifest.py:
+	* plugins/python/androperms/panel.py:
+	* plugins/python/androperms/parser.py:
+	* plugins/python/androperms/reader.py:
+	* plugins/python/androperms/routine.png:
+	* plugins/python/androperms/stack.py:
+	* plugins/python/androperms/string.py:
+	Deleted entries.
+
 16-05-27  Cyrille Bagard <nocbos@gmail.com>
 
 	* src/arch/arm/v7/pseudo.c:
diff --git a/configure.ac b/configure.ac
index e8291b3..f856168 100644
--- a/configure.ac
+++ b/configure.ac
@@ -321,7 +321,6 @@ AC_CONFIG_FILES([Makefile
                  plugins/pychrysa/gui/Makefile
                  plugins/pychrysa/gui/panels/Makefile
                  plugins/python/Makefile
-                 plugins/python/androperms/Makefile
                  plugins/python/apkfiles/Makefile
                  plugins/python/exectracer/Makefile
                  plugins/python/samples/Makefile
diff --git a/plugins/python/Makefile.am b/plugins/python/Makefile.am
index f54e1be..ae5baed 100644
--- a/plugins/python/Makefile.am
+++ b/plugins/python/Makefile.am
@@ -1,2 +1,2 @@
 
-SUBDIRS = androperms apkfiles samples welcome
+SUBDIRS = apkfiles samples welcome
diff --git a/plugins/python/androperms/Makefile.am b/plugins/python/androperms/Makefile.am
deleted file mode 100644
index b1a1e4e..0000000
--- a/plugins/python/androperms/Makefile.am
+++ /dev/null
@@ -1,23 +0,0 @@
-
-andropermsdir = $(datadir)/openida/plugins/python/androperms
-
-androperms_DATA = 							\
-	__init__.py								\
-	android.png								\
-	androperms.db							\
-	androperms.py							\
-	db.py									\
-	defs.py									\
-	manifest.py								\
-	panel.py								\
-	parser.py								\
-	reader.py								\
-	routine.png								\
-	stack.py								\
-	string.py
-
-androperms.db:
-	@tmpzip=`tempfile` ; \
-	wget http://www.android-permissions.org/permissionmap.zip -O $$tmpzip ; \
-	unzip -p $$tmpzip permissionmap/APICalls.txt | tail -n +2 - > androperms.db ; \
-	rm $$tmpzip
diff --git a/plugins/python/androperms/__init__.py b/plugins/python/androperms/__init__.py
deleted file mode 100644
index 8a5a159..0000000
--- a/plugins/python/androperms/__init__.py
+++ /dev/null
@@ -1,2 +0,0 @@
-
-from androperms import AndroPerms as androperms
diff --git a/plugins/python/androperms/android.png b/plugins/python/androperms/android.png
deleted file mode 100644
index ce9c905..0000000
Binary files a/plugins/python/androperms/android.png and /dev/null differ
diff --git a/plugins/python/androperms/androperms.py b/plugins/python/androperms/androperms.py
deleted file mode 100644
index f68b9a5..0000000
--- a/plugins/python/androperms/androperms.py
+++ /dev/null
@@ -1,89 +0,0 @@
-#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-from manifest import AndroidManifest
-from db import PermsDataBase
-from panel import PermsPanel
-from pychrysalide import Plugin
-from pychrysalide.format.dex import DexFormat
-from xml.dom import minidom
-
-import re
-import zipfile
-
-
-class AndroPerms(Plugin):
-    """List all permissions given to an APK files."""
-
-    def init(self, ref):
-        """Initialize the plugin."""
-
-        self._panel = PermsPanel()
-
-        return True
-
-
-    def get_action(self):
-        """Register the plugin for given actions."""
-
-        return Plugin.PGA_DISASS_PROCESS
-
-
-    def execute_on_binary(self, binary, action):
-        """Process once a binary is disassembled."""
-
-        fmt = binary.get_format()
-        if not isinstance(fmt, DexFormat):
-            return False
-
-        zf = zipfile.ZipFile(binary.get_filename())
-
-        f = zf.open('AndroidManifest.xml', 'r')
-        data = f.read()
-        f.closed
-
-        manifest = AndroidManifest(data)
-        xml = minidom.parseString(manifest.getXML())
-
-        # print
-        # print "Permissions for ", binary.get_filename(), " :"
-        # print "-------------"
-        # print
-
-        plist = []
-
-        for p in xml.getElementsByTagName("uses-permission"):
-            plist.append(p.getAttribute("android:name"))
-        #     print p.getAttribute("android:name")
-
-        # print
-
-        db = PermsDataBase()
-        db.filter_permissions(plist)
-
-        instrs = binary.get_instructions()
-        buf = binary.disassembled_buffer
-
-        pfn = re.compile('<.* ([^ ]*)\(')
-
-        for i in instrs:
-
-            if i.keyword.startswith("invoke"):
-
-                line = buf.find_line_by_addr(i.address)
-                text = line.get_text()
-
-                name = pfn.search(text)
-
-                if name != None:
-
-                    resolved = fmt.resolve_relative_routine(i.address)
-
-                    if resolved == None:
-                        reladdr = "0x%08x" % i.address
-                    else:
-                        reladdr = "<%s()+0x%x>" % (resolved[0], resolved[1])
-
-                    db.check_call(i.address, name.group(1), reladdr)
-
-        self._panel.memorize_permissions(binary, db.get_used_permissions())
diff --git a/plugins/python/androperms/db.py b/plugins/python/androperms/db.py
deleted file mode 100644
index 7014915..0000000
--- a/plugins/python/androperms/db.py
+++ /dev/null
@@ -1,94 +0,0 @@
-#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-import os
-
-
-class PermsDataBase:
-    """Display all permissions found in the Manifest."""
-
-    def __init__(self):
-
-        self._perms = { }
-        self._used = { }
-                     
-        self._load_all_definitions()
-
-
-    def _load_all_definitions(self):
-        """Load the database in memory."""
-
-        with open(os.path.dirname(__file__) + '/androperms.db', 'r') as f:
-
-            for line in f.readlines():
-
-                perm = line.strip("\n").split("\t")
-
-                for p in perm[1].split(" "):
-
-                    if not p.startswith("android.permission."):
-                        continue
-
-                    if p not in self._perms:
-                        self._perms[p] = []
-
-                    call = perm[0].split("(")[0]
-
-                    if call not in self._perms[p]:
-                        self._perms[p].append(call)
-
-
-    def filter_permissions(self, used):
-        """Forget all permissions which are not used."""
-
-        keep = {}
-
-        for p in self._perms:
-            if p in used:
-                keep[p] = self._perms[p]
-
-        self._perms = keep
-
-        for p in keep:
-            self._used[p] = []
-
-
-    def check_call(self, addr, line, reladdr):
-        """Check if a call requires some rights."""
-
-        found = False
-
-        for p in self._perms:
-
-            if line.find("Wall") > -1:
-                print "[+]", line, ' ==> ', p
-
-            for c in self._perms[p]:
-
-                #print "  - ", c
-
-                #if line.find(c) > -1:
-                if c.find(line) > -1:
-                    self._used[p].append([reladdr, c + "()", addr])
-                    found = True
-
-        # if not found:
-
-        #     func = line.split('.')[-1]
-
-        #     for p in self._perms:
-
-        #         for c in self._perms[p]:
-
-        #             if c.find(func) > -1:
-
-        #                 #print ">>> %s found in %s" % (func, c)
-
-        #                 self._used[p].append([reladdr, line + "()", addr])
-        #                 break
-
-
-    def get_used_permissions(self):
-        """Provide the list of used permissions."""
-
-        return self._used
diff --git a/plugins/python/androperms/defs.py b/plugins/python/androperms/defs.py
deleted file mode 100644
index e23511e..0000000
--- a/plugins/python/androperms/defs.py
+++ /dev/null
@@ -1,53 +0,0 @@
-#!/usr/bin/python -u
-# -*- coding: utf-8 -*-
-
-
-ATTRIBUTE_IX_NAMESPACE_URI = 0
-ATTRIBUTE_IX_NAME          = 1
-ATTRIBUTE_IX_VALUE_STRING  = 2
-ATTRIBUTE_IX_VALUE_TYPE    = 3
-ATTRIBUTE_IX_VALUE_DATA    = 4
-ATTRIBUTE_LENGHT           = 5
-
-TYPE_NULL               = 0
-TYPE_REFERENCE          = 1
-TYPE_ATTRIBUTE          = 2
-TYPE_STRING             = 3
-TYPE_FLOAT              = 4
-TYPE_DIMENSION          = 5
-TYPE_FRACTION           = 6
-TYPE_FIRST_INT          = 16
-TYPE_INT_DEC            = 16
-TYPE_INT_HEX            = 17
-TYPE_INT_BOOLEAN        = 18
-TYPE_FIRST_COLOR_INT    = 28
-TYPE_INT_COLOR_ARGB8    = 28
-TYPE_INT_COLOR_RGB8     = 29
-TYPE_INT_COLOR_ARGB4    = 30
-TYPE_INT_COLOR_RGB4     = 31
-TYPE_LAST_COLOR_INT     = 31
-TYPE_LAST_INT           = 31
-
-RADIX_MULTS       = [ 0.00390625, 3.051758E-005, 1.192093E-007, 4.656613E-010 ]
-DIMENSION_UNITS   = [ "px", "dip", "sp", "pt", "in", "mm", "", "" ]
-FRACTION_UNITS    = [ "%", "%p", "", "", "", "", "", "" ]
-COMPLEX_UNIT_MASK = 15
-
-
-CHUNK_AXML_FILE           = 0x00080003
-CHUNK_RESOURCEIDS         = 0x00080180
-CHUNK_XML_FIRST           = 0x00100100
-CHUNK_XML_START_NAMESPACE = 0x00100100
-CHUNK_XML_END_NAMESPACE   = 0x00100101
-CHUNK_XML_START_TAG       = 0x00100102
-CHUNK_XML_END_TAG         = 0x00100103
-CHUNK_XML_TEXT            = 0x00100104
-CHUNK_XML_LAST            = 0x00100104
-CHUNK_TYPE                = 0x001C0001
-
-
-START_DOCUMENT = 0
-END_DOCUMENT   = 1
-START_TAG      = 2
-END_TAG        = 3
-TEXT           = 4
diff --git a/plugins/python/androperms/manifest.py b/plugins/python/androperms/manifest.py
deleted file mode 100644
index 63536b2..0000000
--- a/plugins/python/androperms/manifest.py
+++ /dev/null
@@ -1,75 +0,0 @@
-#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-from defs import *
-from reader import AXMLReader
-from parser import AXMLParser
-
-
-class AndroidManifest():
-
-
-    def __init__(self, data):
-
-        self._buffer = ""
-
-        reader = AXMLReader(data)
-        parser = AXMLParser(reader)
-
-        has_ns = False
-        empty = False
-
-        while 1 :
-
-            tag = parser.next()
-
-            if tag == START_DOCUMENT :
-                self._buffer += '<?xml version="1.0" encoding="utf-8"?>\n'
-
-            elif tag == START_TAG:
-
-                if empty:
-                    self._buffer += '>\n'
-
-                self._buffer += '   ' * (parser._namespaces.getDepth() - 2)
-                self._buffer += "<%s%s" % (parser.getTagPrefix(), parser.getTagName())
-
-                if not has_ns:
-                    self._buffer += ' xmlns:%s="%s"' % (parser.getNamespacePrefix(0), parser.getNamespaceUri(0))
-                    has_ns = True
-
-                for i in range(0, parser.countAttributes()):
-                    self._buffer += ' %s%s="%s"' % (parser.getAttribPrefix(i), parser.getAttribName(i), parser.getAttribValue(i))
-
-                empty = True
-
-            elif tag == END_TAG:
-
-                if empty:
-                    self._buffer += '/>\n'
-                    empty = False
-
-                else:
-                    self._buffer += '   ' * (parser._namespaces.getDepth() - 2)
-                    self._buffer += "</%s%s>\n" % (parser.getTagPrefix(), parser.getTagName())
-
-            elif tag == TEXT:
-
-                if empty:
-                    self._buffer += '>\n'
-                    empty = False
-
-                self._buffer += '   ' * (parser._namespaces.getDepth() - 1)
-                self._buffer += "%s\n" % parser.getText()
-
-            elif tag == END_DOCUMENT :
-                break
-
-            else:
-                break
-
-
-    def getXML(self):
-        """Provide the XML content."""
-
-        return self._buffer
diff --git a/plugins/python/androperms/panel.py b/plugins/python/androperms/panel.py
deleted file mode 100644
index 8f8e925..0000000
--- a/plugins/python/androperms/panel.py
+++ /dev/null
@@ -1,125 +0,0 @@
-#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-from pychrysalide.format.dex import DexFormat
-from pychrysalide.gui.panels import PanelItem
-
-import gtk
-import os
-
-
-def _build_permissions_panel_content():
-    """Build content for permissions panels."""
-
-    scrolled_window = gtk.ScrolledWindow()
-    scrolled_window.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
-    scrolled_window.show()
-
-    tree = gtk.TreeView()
-    tree.set_headers_visible(False)
-    tree.show()
-    scrolled_window.add_with_viewport(tree)
-
-    locations = gtk.TreeViewColumn()
-    tree.append_column(locations)
-
-    cell = gtk.CellRendererPixbuf()
-    locations.pack_start(cell, False)
-    locations.add_attribute(cell, 'pixbuf', 0)
-
-    cell = gtk.CellRendererText()
-    locations.pack_start(cell, False)
-    locations.add_attribute(cell, 'text', 1)
-
-    functions = gtk.TreeViewColumn()
-    tree.append_column(functions)
-
-    cell = gtk.CellRendererPixbuf()
-    functions.pack_start(cell, False)
-    functions.add_attribute(cell, 'pixbuf', 2)
-
-    cell = gtk.CellRendererText()
-    functions.pack_start(cell, True)
-    functions.add_attribute(cell, 'text', 3)
-
-    store = gtk.TreeStore(gtk.gdk.Pixbuf, str, gtk.gdk.Pixbuf, str, str)
-    tree.set_model(store)
-
-    return scrolled_window, tree, store
-
-
-class PermsPanel(PanelItem):
-    """Display all permissions found in the Manifest."""
-
-    def __new__(cls):
-        """Create the GLib instance relative this class as soon as possible,
-        for the pygobject registering process."""
-
-        scrolled_window, tree, store = _build_permissions_panel_content()
-
-        self = super(PermsPanel, cls).__new__(cls, 'Permissions', 'Android Permissions', \
-                                                  scrolled_window, 'SE')
-
-        self._scrolled_window = scrolled_window
-        self._tree = tree
-        self._store = store
-
-        self._perms = {}
-
-        return self
-
-
-    def __init__(self):
-        """Initialize the Python instance of the panel."""
-
-        self._tree.connect('row-activated', self._on_row_selection)
-
-        self.dock()
-        self.register()
-
-
-    def memorize_permissions(self, binary, perms):
-        """Attach found permissions to a new loaded binary."""
-
-        self._perms[binary] = perms
-
-
-    def update_for_binary(self, binary):
-        """Fill the treeview with all found permissions for the given binary."""
-
-        self._store.clear()
-
-        fmt = binary.get_format()
-        if not isinstance(fmt, DexFormat):
-            return False
-
-        used = self._perms[binary]
-
-        for p in used:
-
-            if len(used[p]) > 0 or True:
-
-                img = os.path.dirname(os.path.abspath(__file__)) + '/android.png'
-                buf = gtk.gdk.pixbuf_new_from_file(img)
-
-                it = self._store.append(None, [buf, p, None, None, None])
-
-                img = os.path.dirname(os.path.abspath(__file__)) + '/routine.png'
-                buf = gtk.gdk.pixbuf_new_from_file(img)
-
-                for f in used[p]:
-                    self._store.append(it, [None, f[0], buf, f[1], f[2]])
-
-        self._tree.expand_all()
-
-
-    def _on_row_selection(self, treeview, path, column):
-        """Scroll the current view to the selected address."""
-
-        selection = treeview.get_selection()
-        model, it = selection.get_selected()
-
-        # On ne traite que les lignes de code
-        if model.get_value(it, 0) == None:
-
-            self.get_current_view().scroll_to_address(int(model.get_value(it, 4)))
diff --git a/plugins/python/androperms/parser.py b/plugins/python/androperms/parser.py
deleted file mode 100644
index 1939bbe..0000000
--- a/plugins/python/androperms/parser.py
+++ /dev/null
@@ -1,328 +0,0 @@
-#!/usr/bin/python -u
-# -*- coding: utf-8 -*-
-
-
-from defs import *
-from stack import NamespaceStack
-from string import StringBlock
-
-from struct import unpack
-
-
-class AXMLParser():
-
-
-    def __init__(self, reader):
-
-        self._reader = reader
-
-        magic = reader.readInt()
-        if magic != CHUNK_AXML_FILE:
-            raise Exception('Bad Magic Number (0x%08lx)!' % magic)
-
-        # chunkSize
-        reader.skipInt()
-
-        self._strings = StringBlock(reader)
-        self._namespaces = NamespaceStack()
-        self._operational = True
-
-        self.resetEventInfo()
-
-
-    def resetEventInfo(self):
-
-        self._event = -1
-        self._line_number = -1
-        self._name = -1
-        self._namespace_uri = -1
-        self._attributes = None
-        self._id_attrib = -1
-        self._class_attrib = -1
-        self._style_attrib = -1
-
-        self._decreaseDepth = False
-
-
-
-    def next(self):
-
-        self.doNext()
-        return self._event
-
-
-    def doNext(self):
-
-
-
-
-
-        event = self._event
-
-
-        while True:
-
-            if self._decreaseDepth:
-                self._decreaseDepth = False
-                self._namespaces.decDepth()
-
-            # Fake END_DOCUMENT event.
-            if event == END_TAG and self._namespaces.getDepth() == 1 and self._namespaces.count() == 0:
-                self._event = END_DOCUMENT
-                break
-
-            if event == START_DOCUMENT:
-                # Fake event, see CHUNK_XML_START_TAG handler.
-                chunk = CHUNK_XML_START_TAG
-
-            else:
-                chunk = self._reader.readInt()
-
-            if chunk == CHUNK_RESOURCEIDS:
-
-                size = self._reader.readInt()
-                if size < 8 or size % 4 != 0:
-                    raise Exception('Invalid resource ids size (%d).' % size)
-
-                self._resource_ids = self._reader.readIntArray(size / 4 - 2)
-
-                continue
-
-            if chunk < CHUNK_XML_FIRST or chunk > CHUNK_XML_LAST:
-                raise Exception('Invalid chunk type 0x%08lx.' % chunk)
-
-            # Fake START_DOCUMENT event.
-            if chunk == CHUNK_XML_START_TAG and event == -1:
-                self._event = START_DOCUMENT
-                break
-
-            # Common header.
-            self._reader.skipInt() # chunkSize
-            self._line_number = self._reader.readInt()
-            self._reader.skipInt() # 0xffffffff
-
-            if chunk == CHUNK_XML_START_NAMESPACE or chunk == CHUNK_XML_END_NAMESPACE:
-
-                if chunk == CHUNK_XML_START_NAMESPACE:
-
-                    prefix = self._reader.readInt()
-                    uri = self._reader.readInt()
-                    self._namespaces.push(prefix, uri)
-
-                else:
-
-                    self._reader.skipInt() # prefix
-                    self._reader.skipInt() # uri
-                    self._namespaces.pop()
-
-                continue
-
-            elif chunk == CHUNK_XML_START_TAG:
-
-                self._namespace_uri = self._reader.readInt()
-                self._name = self._reader.readInt()
-                self._reader.skipInt() # flags ?
-
-                attribs_count = self._reader.readInt()
-                self._id_attrib = (attribs_count >> 16) - 1
-                attribs_count &= 0xffff
-
-                self._class_attrib = self._reader.readInt()
-                self._style_attrib = (self._class_attrib >> 16) - 1
-                self._class_attrib = (self._class_attrib & 0xffff) - 1
-
-                self._attributes = self._reader.readIntArray(attribs_count * ATTRIBUTE_LENGHT)
-
-                for i in range(ATTRIBUTE_IX_VALUE_TYPE, len(self._attributes), ATTRIBUTE_LENGHT):
-                    self._attributes[i] >>= 24
-
-                self._namespaces.incDepth()
-                self._event = START_TAG
-
-                break
-
-            elif chunk == CHUNK_XML_END_TAG:
-
-                self._namespaceUri = self._reader.readInt()
-                self._name = self._reader.readInt()
-
-                self._event = END_TAG
-                self._decreaseDepth = True
-
-                break
-
-            elif chunk == CHUNK_XML_TEXT:
-
-                self._name = self._reader.readInt()
-                self._reader.skipInt() # ???
-                self._reader.skipInt() # ???
-
-                self._event=TEXT
-
-                break				
-
-            else:
-                raise Exception('Unknown chunck (0x%08lx)' % chunk)
-
-
-    ### ESPACES ###
-
-    def getNamespacePrefix(self, index):
-
-        name = self._namespaces.getPrefix(index)
-
-        if name == -1:
-            return ''
-
-        else:
-            return self._strings.getRaw(name)
-
-
-    def getNamespaceUri(self, index):
-
-        name = self._namespaces.getUri(index)
-
-        if name == -1:
-            return ''
-
-        else:
-            return self._strings.getRaw(name)
-
-
-    ### NAMES ###
-
-    def getTagPrefix(self):
-        """Provide the prefix linked to START_TAG or END_TAG."""
-
-        name = self._namespaces.findPrefix(self._namespace_uri)
-
-        if name == -1:
-            return ''
-
-        else:
-            return self._strings.getRaw(name) + ':'
-
-
-    def getTagName(self):
-        """Provide the name linked to START_TAG or END_TAG."""
-
-        if self._name == -1 or (self._event != START_TAG and self._event != END_TAG):
-            raise Exception('Invalid tag name.')
-
-        return self._strings.getRaw(self._name)
-
-
-    def getText(self):
-        """Provide the content linked to TEXT."""
-
-        if self._name == -1 or self._event != START_TEXT:
-            raise Exception('Invalid text content.')
-
-        return self._strings.getRaw(self._name)
-
-
-    ### ATRIBUTES ###
-
-    def countAttributes(self):
-        """Count the properties of the current tag."""
-
-        if self._event != START_TAG:
-            raise Exception('Invalid event.')
-
-        return len(self._attributes) / ATTRIBUTE_LENGHT
-
-
-    def getAttribPrefix(self, index):
-        """Get the prefix of a given attribute."""
-
-        index *= ATTRIBUTE_LENGHT
-
-        if index >= len(self._attributes):
-            raise Exception('Bad attribute index.')
-
-        uri = self._attributes[index + ATTRIBUTE_IX_NAMESPACE_URI]
-        name = self._namespaces.findPrefix(uri)
-
-        if name == -1:
-            return ''
-
-        else:
-            return self._strings.getRaw(name) + ':'
-
-
-    def getAttribName(self, index):
-        """Get the name of a given attribute."""
-
-        index *= ATTRIBUTE_LENGHT
-
-        if index >= len(self._attributes):
-            raise Exception('Bad attribute index.')
-
-        name = self._attributes[index + ATTRIBUTE_IX_NAME]
-
-        if name == -1:
-            return '???'
-
-        else:
-            return self._strings.getRaw(name)
-
-
-    def getAttribValue(self, index):
-        """Get the value of a given attribute."""
-
-        index *= ATTRIBUTE_LENGHT
-
-        if index >= len(self._attributes):
-            raise Exception('Bad attribute index.')
-
-        vtype = self._attributes[index + ATTRIBUTE_IX_VALUE_TYPE]
-        vdata = self._attributes[index + ATTRIBUTE_IX_VALUE_DATA]
-
-        if vtype == TYPE_NULL:
-            return '???'
-
-        elif vtype == TYPE_REFERENCE:
-            return '@%s%08X' % (self.getPackage(vdata), vdata)
-
-        elif vtype == TYPE_ATTRIBUTE:
-            return '?%s%08X' % (self.getPackage(vdata), vdata)
-
-        if vtype == TYPE_STRING:
-            vdata = self._attributes[index + ATTRIBUTE_IX_VALUE_STRING]
-            return self._strings.getRaw(vdata)
-
-        elif vtype == TYPE_FLOAT:
-            return '%f' % unpack('=f', pack('=L', vdata))[0] 
-
-        elif vtype == TYPE_DIMENSION:
-            return '%f%s' % (self.complexToFloat(vdata), DIMENSION_UNITS[vdata & COMPLEX_UNIT_MASK])
-
-        elif vtype == TYPE_FRACTION:
-            return '%f%s' % (self.complexToFloat(vdata), FRACTION_UNITS[vdata & COMPLEX_UNIT_MASK])
-
-        elif vtype == TYPE_INT_HEX:
-            return '0x%08x' % vdata
-
-        elif vtype == TYPE_INT_BOOLEAN:
-            if vdata == 0:
-                return 'false'
-            else:
-                return 'true'
-
-        elif vtype >= TYPE_FIRST_COLOR_INT and vtype <= TYPE_LAST_COLOR_INT:
-            return '#%08x' % vdata
-
-        elif vtype >= TYPE_FIRST_INT and vtype <= TYPE_LAST_INT:
-            return str(vdata)
-
-        return "<0x%x, 0x%02x>" % (vdata, vtype)
-
-
-    def complexToFloat(self, xcomplex):
-        return (float)(xcomplex & 0xffffff00) * RADIX_MULTS[(xcomplex >> 4) & 3];
-
-    def getPackage(self, id):
-        if id >> 24 == 1:
-            return "android:"
-        else:
-            return ""
diff --git a/plugins/python/androperms/reader.py b/plugins/python/androperms/reader.py
deleted file mode 100644
index f126850..0000000
--- a/plugins/python/androperms/reader.py
+++ /dev/null
@@ -1,41 +0,0 @@
-#!/usr/bin/python -u
-# -*- coding: utf-8 -*-
-
-
-from struct import unpack
-
-
-class AXMLReader():
-    """Provide various read helpers."""
-
-    def __init__(self, data):
-
-        self._data = data
-
-        self._position = 0
-        self._length = len(self._data)
-
-
-    def readInt(self):
-        """Read a 4-bytes value."""
-
-        self.skipInt()
-
-        value = unpack('<L', self._data[self._position - 4 : self._position])[0]
-
-        return value
-
-
-    def skipInt(self):
-        """Skip a 4-bytes value."""
-
-        self._position += 4
-
-        if self._position > self._length:
-            raise Exception("Reader out of bound (%d > %d)!" % (self._position, self._length))
-
-
-    def readIntArray(self, length):
-        """Read an array composed of 4-bytes values."""
-
-        return [ self.readInt() for i in range(0, length) ]
diff --git a/plugins/python/androperms/routine.png b/plugins/python/androperms/routine.png
deleted file mode 100644
index 2ddc67a..0000000
Binary files a/plugins/python/androperms/routine.png and /dev/null differ
diff --git a/plugins/python/androperms/stack.py b/plugins/python/androperms/stack.py
deleted file mode 100644
index 38431dc..0000000
--- a/plugins/python/androperms/stack.py
+++ /dev/null
@@ -1,108 +0,0 @@
-#!/usr/bin/python -u
-# -*- coding: utf-8 -*-
-
-
-class NamespaceStack():
-
-
-    def __init__(self):
-
-        #        self.increaseDepth()
-
-
-        self._depth = 1
-
-        self._prefix_2_uri = {}
-        self._uri_2_prefix = {}
-
-        self._pairs = []
-
-        pass
-
-
-
-    def getDepth(self):
-
-        return self._depth
-
-
-    def incDepth(self):
-
-        self._depth += 1
-
-
-    def decDepth(self):
-
-        self._depth -= 1
-
-
-
-
-
-    def count(self):
-        """Provider the current number of active namespaces."""
-
-        return len(self._pairs)
-
-
-
-
-
-
-
-    def push(self, prefix, uri):
-
-        self._prefix_2_uri[prefix] = uri
-        self._uri_2_prefix[uri] = prefix
-
-        self._pairs.append((prefix, uri))
-
-        #print "PUSH", prefix, uri
-
-
-
-
-    def pop(self):
-
-        self._pairs.pop()
-
-        #print "POP"
-
-
-
-
-
-    def getPrefix(self, index):
-
-        if index < len(self._pairs):
-            return self._pairs[index][0]
-
-        else:
-            return -1
-
-
-    def findPrefix(self, uri):
-
-        if uri in self._uri_2_prefix:
-            return self._uri_2_prefix[uri]
-
-        else:
-            return -1
-
-
-    def getUri(self, index):
-
-        if index < len(self._pairs):
-            return self._pairs[index][1]
-
-        else:
-            return -1
-
-
-    def findUri(self, prefix):
-
-        if prefix in self._prefix_2_uri:
-            return self._prefix_2_uri[prefix]
-
-        else:
-            return -1
diff --git a/plugins/python/androperms/string.py b/plugins/python/androperms/string.py
deleted file mode 100644
index 09a7b93..0000000
--- a/plugins/python/androperms/string.py
+++ /dev/null
@@ -1,82 +0,0 @@
-#!/usr/bin/python -u
-# -*- coding: utf-8 -*-
-
-
-from defs import CHUNK_TYPE
-
-
-class StringBlock():
-
-
-    def __init__(self, reader):
-
-        magic = reader.readInt()
-        if magic != CHUNK_TYPE:
-            raise Exception("Bad Magic Number (0x%08lx)!" % magic)
-
-	chunk_size = reader.readInt()
-        str_count = reader.readInt()
-        style_offset_count = reader.readInt()
-        reader.readInt() # ???
-        str_offset = reader.readInt()
-        styles_offset = reader.readInt()
-
-        self._str_offsets = reader.readIntArray(str_count);
-        self._style_offsets = reader.readIntArray(style_offset_count);
-
-        if styles_offset == 0:
-            size = chunk_size - str_offset
-        else:
-            size = styles_offset - str_offset
-
-        if size % 4 != 0:
-            raise Exception("String data size is not multiple of 4 (%d)!" % size)
-
-        self._strings = reader.readIntArray(size / 4)
-
-        if styles_offset > 0:
-
-            size = chunk_size - styles_offset
-
-            if size % 4 != 0:
-                raise Exception("Style data size is not multiple of 4 (%d)!" % size)
-
-            self._styles = reader.readIntArray(size / 4)
-
-        self._str_data = [ self.getRaw(i) for i in range(self.count()) ]
-
-
-    def count(self):
-        """Count the number of strings in the current block."""
-
-        return len(self._str_offsets)
-
-
-    def getRaw(self, index):
-        """Provide a raw string (without any styling information) at specified index."""
-
-        if index < 0 or index >= len(self._str_offsets):
-            raise Exception("Invalid Index (%d)!" % index)
-
-        offset = self._str_offsets[index]
-        length = self.getShort(self._strings, offset)
-
-        data = ''
-
-        for i in range(length):
-            offset += 2
-            data += unichr(self.getShort(self._strings, offset))
-
-        return data
-
-
-    def getShort(self, array, offset):
-
-        value = array[offset / 4]
-
-        if ((offset % 4) / 2) == 0:
-            value &= 0xFFFF
-        else:
-            value >>= 16
-
-        return value
-- 
cgit v0.11.2-87-g4458