!c99Shell v. 1.0 pre-release build #16!

Software: Apache/2.2.3 (CentOS). PHP/5.1.6 

uname -a: Linux mx-ll-110-164-51-230.static.3bb.co.th 2.6.18-194.el5PAE #1 SMP Fri Apr 2 15:37:44
EDT 2010 i686
 

uid=48(apache) gid=48(apache) groups=48(apache) 

Safe-mode: OFF (not secure)

/usr/lib/python2.4/site-packages/Alacarte/   drwxr-xr-x
Free 50.78 GB of 127.8 GB (39.73%)
Home    Back    Forward    UPDIR    Refresh    Search    Buffer    Encoder    Tools    Proc.    FTP brute    Sec.    SQL    PHP-code    Update    Feedback    Self remove    Logout    


Viewing file:     MenuEditor.py (25.21 KB)      -rw-r--r--
Select action/file-type:
(+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
# -*- coding: utf-8 -*-
#   Alacarte Menu Editor - Simple fd.o Compliant Menu Editor
#   Copyright (C) 2006  Travis Watkins, Heinrich Wendel
#
#   This library is free software; you can redistribute it and/or
#   modify it under the terms of the GNU Library General Public
#   License as published by the Free Software Foundation; either
#   version 2 of the License, or (at your option) any later version.
#
#   This library is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
#   Library General Public License for more details.
#
#   You should have received a copy of the GNU Library General Public
#   License along with this library; if not, write to the Free Software
#   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

import os, re, xml.dom.minidom, locale
import gmenu
from Alacarte import util

class Menu:
    tree = None
    visible_tree = None
    path = None
    dom = None

class MenuEditor:
    #lists for undo/redo functionality
    __undo = []
    __redo = []

    def __init__(self):
        self.locale = locale.getdefaultlocale()[0]
        self.__loadMenus()

    def __loadMenus(self):
        self.applications = Menu()
        self.applications.tree = gmenu.lookup_tree('applications.menu', gmenu.FLAGS_SHOW_EMPTY|gmenu.FLAGS_INCLUDE_EXCLUDED|gmenu.FLAGS_INCLUDE_NODISPLAY)
        self.applications.visible_tree = gmenu.lookup_tree('applications.menu')
        self.applications.path = os.path.join(util.getUserMenuPath(), self.applications.tree.get_menu_file())
        if not os.path.isfile(self.applications.path):
            self.applications.dom = xml.dom.minidom.parseString(util.getUserMenuXml(self.applications.tree))
        else:
            self.applications.dom = xml.dom.minidom.parse(self.applications.path)
        self.__remove_whilespace_nodes(self.applications.dom)

        self.settings = Menu()
        self.settings.tree = gmenu.lookup_tree('settings.menu', gmenu.FLAGS_SHOW_EMPTY|gmenu.FLAGS_INCLUDE_EXCLUDED|gmenu.FLAGS_INCLUDE_NODISPLAY)
        self.settings.visible_tree = gmenu.lookup_tree('settings.menu')
        self.settings.path = os.path.join(util.getUserMenuPath(), self.settings.tree.get_menu_file())
        if not os.path.isfile(self.settings.path):
            self.settings.dom = xml.dom.minidom.parseString(util.getUserMenuXml(self.settings.tree))
        else:
            self.settings.dom = xml.dom.minidom.parse(self.settings.path)
        self.__remove_whilespace_nodes(self.settings.dom)
        self.save(True)

    def save(self, from_loading=False):
        for menu in ('applications', 'settings'):
            fd = open(getattr(self, menu).path, 'w')
            fd.write(re.sub("\n[\s]*([^\n<]*)\n[\s]*</", "\\1</", getattr(self, menu).dom.toprettyxml().replace('<?xml version="1.0" ?>\n', '')))
            fd.close()
        if not from_loading:
            self.__loadMenus()

    def quit(self):
        for file_name in os.listdir(util.getUserItemPath()):
            if file_name[-6:-2] in ('redo', 'undo'):
                file_path = os.path.join(util.getUserItemPath(), file_name)
                os.unlink(file_path)
        for file_name in os.listdir(util.getUserDirectoryPath()):
            if file_name[-6:-2] in ('redo', 'undo'):
                file_path = os.path.join(util.getUserDirectoryPath(), file_name)
                os.unlink(file_path)
        for file_name in os.listdir(util.getUserMenuPath()):
            if file_name[-6:-2] in ('redo', 'undo'):
                file_path = os.path.join(util.getUserMenuPath(), file_name)
                os.unlink(file_path)

    def revert(self):
        for name in ('applications', 'settings'):
            menu = getattr(self, name)
            self.revertTree(menu.tree.root)
            path = os.path.join(util.getUserMenuPath(), menu.tree.get_menu_file())
            try:
                os.unlink(path)
            except OSError:
                pass
            #reload DOM for each menu
            if not os.path.isfile(menu.path):
                menu.dom = xml.dom.minidom.parseString(util.getUserMenuXml(menu.tree))
            else:
                menu.dom = xml.dom.minidom.parse(menu.path)
            self.__remove_whilespace_nodes(menu.dom)
            #reset undo/redo, no way to recover from this
            self.__undo, self.__redo = [], []
        self.save()

    def revertTree(self, menu):
        for child in menu.get_contents():
            if child.get_type() == gmenu.TYPE_DIRECTORY:
                self.revertTree(child)
            elif child.get_type() == gmenu.TYPE_ENTRY:
                self.revertItem(child)
        self.revertMenu(menu)

    def undo(self):
        if len(self.__undo) == 0:
            return
        files = self.__undo.pop()
        redo = []
        for file_path in files:
            new_path = file_path.rsplit('.', 1)[0]
            redo_path = util.getUniqueRedoFile(new_path)
            data = open(new_path).read()
            open(redo_path, 'w').write(data)
            data = open(file_path).read()
            open(new_path, 'w').write(data)
            os.unlink(file_path)
            redo.append(redo_path)
        #reload DOM to make changes stick
        for name in ('applications', 'settings'):
            menu = getattr(self, name)
            if not os.path.isfile(menu.path):
                menu.dom = xml.dom.minidom.parseString(util.getUserMenuXml(menu.tree))
            else:
                menu.dom = xml.dom.minidom.parse(menu.path)
            self.__remove_whilespace_nodes(menu.dom)
        self.__redo.append(redo)

    def redo(self):
        if len(self.__redo) == 0:
            return
        files = self.__redo.pop()
        undo = []
        for file_path in files:
            new_path = file_path.rsplit('.', 1)[0]
            undo_path = util.getUniqueUndoFile(new_path)
            data = open(new_path).read()
            open(undo_path, 'w').write(data)
            data = open(file_path).read()
            open(new_path, 'w').write(data)
            os.unlink(file_path)
            undo.append(undo_path)
        #reload DOM to make changes stick
        for name in ('applications', 'settings'):
            menu = getattr(self, name)
            if not os.path.isfile(menu.path):
                menu.dom = xml.dom.minidom.parseString(util.getUserMenuXml(menu.tree))
            else:
                menu.dom = xml.dom.minidom.parse(menu.path)
            self.__remove_whilespace_nodes(menu.dom)
        self.__undo.append(undo)

    def getMenus(self, parent=None):
        if parent == None:
            yield self.applications.tree.root
            yield self.settings.tree.root
        else:
            for menu in parent.get_contents():
                if menu.get_type() == gmenu.TYPE_DIRECTORY:
                    yield (menu, self.__isVisible(menu))

    def getItems(self, menu):
        for item in menu.get_contents():
            if item.get_type() == gmenu.TYPE_SEPARATOR:
                yield (item, True)
            else:
                if item.get_type() == gmenu.TYPE_ENTRY and item.get_desktop_file_id()[-19:] == '-usercustom.desktop':
                    continue
                yield (item, self.__isVisible(item))

    def canRevert(self, item):
        if item.get_type() == gmenu.TYPE_ENTRY:
            if util.getItemPath(item.get_desktop_file_id()):
                path = util.getUserItemPath()
                if os.path.isfile(os.path.join(path, item.get_desktop_file_id())):
                    return True
        elif item.get_type() == gmenu.TYPE_DIRECTORY:
            if item.get_desktop_file_path():
                file_id = os.path.split(item.get_desktop_file_path())[1]
            else:
                file_id = item.get_menu_id() + '.directory'
            if util.getDirectoryPath(file_id):
                path = util.getUserDirectoryPath()
                if os.path.isfile(os.path.join(path, file_id)):
                    return True
        return False

    def setVisible(self, item, visible):
        dom = self.__getMenu(item).dom
        if item.get_type() == gmenu.TYPE_ENTRY:
            self.__addUndo([self.__getMenu(item), item])
            menu_xml = self.__getXmlMenu(self.__getPath(item.get_parent()), dom, dom)
            if visible:
                self.__addXmlFilename(menu_xml, dom, item.get_desktop_file_id(), 'Include')
                self.__writeItem(item, no_display=False)
            else:
                self.__addXmlFilename(menu_xml, dom, item.get_desktop_file_id(), 'Exclude')
            self.__addXmlTextElement(menu_xml, 'AppDir', util.getUserItemPath(), dom)
        elif item.get_type() == gmenu.TYPE_DIRECTORY:
            self.__addUndo([self.__getMenu(item), item])
            #don't mess with it if it's empty
            if len(item.get_contents()) == 0:
                return
            menu_xml = self.__getXmlMenu(self.__getPath(item), dom, dom)
            for node in self.__getXmlNodesByName(['Deleted', 'NotDeleted'], menu_xml):
                node.parentNode.removeChild(node)
            if visible:
                self.__writeMenu(item, no_display=False)
            else:
                self.__writeMenu(item, no_display=True)
            self.__addXmlTextElement(menu_xml, 'DirectoryDir', util.getUserDirectoryPath(), dom)
        self.save()

    def createItem(self, parent, icon, name, comment, command, use_term, before=None, after=None):
        file_id = self.__writeItem(None, icon, name, comment, command, use_term)
        dom = self.__getMenu(parent).dom
        self.__addItem(parent, file_id, dom)
        self.__positionItem(parent, ('Item', file_id), before, after)
        self.__addUndo([self.__getMenu(parent), ('Item', file_id)])
        self.save()

    def createMenu(self, parent, icon, name, comment, before=None, after=None):
        file_id = self.__writeMenu(None, icon, name, comment)
        menu_id = file_id.rsplit('.', 1)[0]
        dom = self.__getMenu(parent).dom
        menu_xml = self.__getXmlMenu(self.__getPath(parent) + '/' + menu_id, dom, dom)
        self.__addXmlTextElement(menu_xml, 'Directory', file_id, dom)
        self.__positionItem(parent, ('Menu', menu_id), before, after)
        self.__addUndo([self.__getMenu(parent), ('Menu', file_id)])
        self.save()

    def createSeparator(self, parent, before=None, after=None):
        self.__positionItem(parent, ('Separator',), before, after)
        self.__addUndo([self.__getMenu(parent), ('Separator',)])
        self.save()

    def editItem(self, item, icon, name, comment, command, use_term, parent=None, final=True):
        #if nothing changed don't make a user copy
        if icon == item.get_icon() and name == item.get_name() and comment == item.get_comment() and command == item.get_exec() and use_term == item.get_launch_in_terminal():
            return
        #hack, item.get_parent() seems to fail a lot
        if not parent:
            parent = item.get_parent()
        if final:
            self.__addUndo([self.__getMenu(parent), item])
        self.__writeItem(item, icon, name, comment, command, use_term)
        if final:
            dom = self.__getMenu(parent).dom
            menu_xml = self.__getXmlMenu(self.__getPath(parent), dom, dom)
            self.__addXmlTextElement(menu_xml, 'AppDir', util.getUserItemPath(), dom)
        self.save()

    def editMenu(self, menu, icon, name, comment, final=True):
        #if nothing changed don't make a user copy
        if icon == menu.get_icon() and name == menu.get_name() and comment == menu.get_comment():
            return
        #we don't use this, we just need to make sure the <Menu> exists
        #otherwise changes won't show up
        dom = self.__getMenu(menu).dom
        menu_xml = self.__getXmlMenu(self.__getPath(menu), dom, dom)
        file_id = self.__writeMenu(menu, icon, name, comment)
        if final:
            self.__addXmlTextElement(menu_xml, 'DirectoryDir', util.getUserDirectoryPath(), dom)
            self.__addUndo([self.__getMenu(menu), menu])
        self.save()

    def copyItem(self, item, new_parent, before=None, after=None):
        dom = self.__getMenu(new_parent).dom
        file_path = item.get_desktop_file_path()
        keyfile = util.DesktopParser(file_path)
        #erase Categories in new file
        keyfile.set('Categories', ('',))
        keyfile.set('Hidden', False)
        file_id = util.getUniqueFileId(item.get_name(), '.desktop')
        out_path = os.path.join(util.getUserItemPath(), file_id)
        keyfile.write(open(out_path, 'w'))
        self.__addItem(new_parent, file_id, dom)
        self.__positionItem(new_parent, ('Item', file_id), before, after)
        self.__addUndo([self.__getMenu(new_parent), ('Item', file_id)])
        self.save()
        return file_id

    def moveItem(self, item, new_parent, before=None, after=None):
        undo = []
        if item.get_parent() != new_parent:
            #hide old item
            self.deleteItem(item)
            undo.append(item)
            file_id = self.copyItem(item, new_parent)
            item = ('Item', file_id)
            undo.append(item)
        self.__positionItem(new_parent, item, before, after)
        undo.append(self.__getMenu(new_parent))
        self.__addUndo(undo)
        self.save()

    def moveMenu(self, menu, new_parent, before=None, after=None):
        parent = new_parent
        #don't move a menu into it's child
        while parent.get_parent():
            parent = parent.get_parent()
            if parent == menu:
                return False
        #can't move between top-level menus
        if self.__getMenu(menu) != self.__getMenu(new_parent):
            return False
        if menu.get_parent() != new_parent:
            dom = self.__getMenu(menu).dom
            root_path = self.__getPath(menu).split('/', 1)[0]
            xml_root = self.__getXmlMenu(root_path, dom, dom)
            old_path = self.__getPath(menu).split('/', 1)[1]
            #root menu's path has no /
            if '/' in self.__getPath(new_parent):
                new_path = self.__getPath(new_parent).split('/', 1)[1] + '/' + menu.get_menu_id()
            else:
                new_path = menu.get_menu_id()
            self.__addXmlMove(xml_root, old_path, new_path, dom)
        self.__positionItem(new_parent, menu, before, after)
        self.__addUndo([self.__getMenu(new_parent),])
        self.save()

    def moveSeparator(self, separator, new_parent, before=None, after=None):
        self.__positionItem(new_parent, separator, before, after)
        self.__addUndo([self.__getMenu(new_parent),])
        self.save()

    def deleteItem(self, item):
        self.__writeItem(item, hidden=True)
        self.__addUndo([item,])
        self.save()

    def deleteMenu(self, menu):
        dom = self.__getMenu(menu).dom
        menu_xml = self.__getXmlMenu(self.__getPath(menu), dom, dom)
        self.__addDeleted(menu_xml, dom)
        self.__addUndo([self.__getMenu(menu),])
        self.save()

    def deleteSeparator(self, item):
        parent = item.get_parent()
        contents = parent.get_contents()
        contents.remove(item)
        layout = self.__createLayout(contents)
        dom = self.__getMenu(parent).dom
        menu_xml = self.__getXmlMenu(self.__getPath(parent), dom, dom)
        self.__addXmlLayout(menu_xml, layout, dom)
        self.__addUndo([self.__getMenu(item.get_parent()),])
        self.save()

    def revertItem(self, item):
        if not self.canRevert(item):
            return
        self.__addUndo([item,])
        try:
            os.remove(item.get_desktop_file_path())
        except OSError:
            pass
        self.save()

    def revertMenu(self, menu):
        if not self.canRevert(menu):
            return
        self.__addUndo([menu,])
        file_id = os.path.split(menu.get_desktop_file_path())[1]
        path = os.path.join(util.getUserDirectoryPath(), file_id)
        try:
            os.remove(path)
        except OSError:
            pass
        self.save()

    #private stuff
    def __addUndo(self, items):
        self.__undo.append([])
        for item in items:
            if isinstance(item, Menu):
                file_path = item.path
            elif isinstance(item, tuple):
                if item[0] == 'Item':
                    file_path = os.path.join(util.getUserItemPath(), item[1])
                    if not os.path.isfile(file_path):
                        file_path = util.getItemPath(item[1])
                elif item[0] == 'Menu':
                    file_path = os.path.join(util.getUserDirectoryPath(), item[1])
                    if not os.path.isfile(file_path):
                        file_path = util.getDirectoryPath(item[1])
                else:
                    continue
            elif item.get_type() == gmenu.TYPE_DIRECTORY:
                file_path = os.path.join(util.getUserDirectoryPath(), os.path.split(item.get_desktop_file_path())[1])
                if not os.path.isfile(file_path):
                    file_path = item.get_desktop_file_path()
            elif item.get_type() == gmenu.TYPE_ENTRY:
                file_path = os.path.join(util.getUserItemPath(), item.get_desktop_file_id())
                if not os.path.isfile(file_path):
                    file_path = item.get_desktop_file_path()
            else:
                continue
            data = open(file_path).read()
            undo_path = util.getUniqueUndoFile(file_path)
            open(undo_path, 'w').write(data)
            self.__undo[-1].append(undo_path)

    def __getMenu(self, item):
        root = item.get_parent()
        if not root:
            #already at the top
            root = item
        else:
            while True:
                if root.get_parent():
                    root = root.get_parent()
                else:
                    break
        if root.menu_id == self.applications.tree.root.menu_id:
            return self.applications
        return self.settings

    def __isVisible(self, item):
        if item.get_type() == gmenu.TYPE_ENTRY:
            return not (item.get_is_excluded() or item.get_is_nodisplay())
        def loop_for_menu(parent, menu):
            for item in parent.get_contents():
                if item.get_type() == gmenu.TYPE_DIRECTORY:
                    if item.menu_id == menu.menu_id:
                        return True
                    temp = loop_for_menu(item, menu)
                    if temp:
                        return True
            return False
        menu = self.__getMenu(item)
        if menu == self.applications:
            root = self.applications.visible_tree.root
        elif menu == self.settings:
            root = self.settings.visible_tree.root
        if item.get_type() == gmenu.TYPE_DIRECTORY:
            return loop_for_menu(root, item)
        return True

    def __getPath(self, menu, path=None):
        if not path:
            if self.__getMenu(menu) == self.applications:
                path = 'Applications'
            else:
                path = 'Desktop'
        if menu.get_parent():
            path = self.__getPath(menu.get_parent(), path)
            path += '/'
            path += menu.menu_id
        return path

    def __getXmlMenu(self, path, element, dom):
        if '/' in path:
            (name, path) = path.split('/', 1)
        else:
            name = path
            path = ''

        found = None
        for node in self.__getXmlNodesByName('Menu', element):
            for child in self.__getXmlNodesByName('Name', node):
                if child.childNodes[0].nodeValue == name:
                    if path:
                        found = self.__getXmlMenu(path, node, dom)
                    else:
                        found = node
                    break
            if found:
                break
        if not found:
            node = self.__addXmlMenuElement(element, name, dom)
            if path:
                found = self.__getXmlMenu(path, node, dom)
            else:
                found = node

        return found

    def __addXmlMenuElement(self, element, name, dom):
        node = dom.createElement('Menu')
        self.__addXmlTextElement(node, 'Name', name, dom)
        return element.appendChild(node)

    def __addXmlTextElement(self, element, name, text, dom):
        node = dom.createElement(name)
        text = dom.createTextNode(text)
        node.appendChild(text)
        return element.appendChild(node)

    def __addXmlFilename(self, element, dom, filename, type = 'Include'):
        # remove old filenames
        for node in self.__getXmlNodesByName(['Include', 'Exclude'], element):
            if node.childNodes[0].nodeName == 'Filename' and node.childNodes[0].childNodes[0].nodeValue == filename:
                element.removeChild(node)

        # add new filename
        node = dom.createElement(type)
        node.appendChild(self.__addXmlTextElement(node, 'Filename', filename, dom))
        return element.appendChild(node)

    def __addDeleted(self, element, dom):
        node = dom.createElement('Deleted')
        return element.appendChild(node)

    def __writeItem(self, item=None, icon=None, name=None, comment=None, command=None, use_term=None, no_display=None, startup_notify=None, hidden=None):
        if item:
            file_path = item.get_desktop_file_path()
            file_id = item.get_desktop_file_id()
            keyfile = util.DesktopParser(file_path)
        elif item == None and name == None:
            raise Exception('New menu items need a name')
        else:
            file_id = util.getUniqueFileId(name, '.desktop')
            keyfile = util.DesktopParser()
        if icon:
            keyfile.set('Icon', icon)
            keyfile.set('Icon', icon, self.locale)
        if name:
            keyfile.set('Name', name)
            keyfile.set('Name', name, self.locale)
        if comment:
            keyfile.set('Comment', comment)
            keyfile.set('Comment', comment, self.locale)
        if command:
            keyfile.set('Exec', command)
        if use_term != None:
            keyfile.set('Terminal', use_term)
        if no_display != None:
            keyfile.set('NoDisplay', no_display)
        if startup_notify != None:
            keyfile.set('StartupNotify', startup_notify)
        if hidden != None:
            keyfile.set('Hidden', hidden)
        out_path = os.path.join(util.getUserItemPath(), file_id)
        keyfile.write(open(out_path, 'w'))
        return file_id

    def __writeMenu(self, menu=None, icon=None, name=None, comment=None, no_display=None):
        if menu:
            file_id = os.path.split(menu.get_desktop_file_path())[1]
            file_path = menu.get_desktop_file_path()
            keyfile = util.DesktopParser(file_path)
        elif menu == None and name == None:
            raise Exception('New menus need a name')
        else:
            file_id = util.getUniqueFileId(name, '.directory')
            keyfile = util.DesktopParser(file_type='Directory')
        if icon:
            keyfile.set('Icon', icon)
        if name:
            keyfile.set('Name', name)
            keyfile.set('Name', name, self.locale)
        if comment:
            keyfile.set('Comment', comment)
            keyfile.set('Comment', comment, self.locale)
        if no_display != None:
            keyfile.set('NoDisplay', no_display)
        out_path = os.path.join(util.getUserDirectoryPath(), file_id)
        keyfile.write(open(out_path, 'w'))
        return file_id

    def __getXmlNodesByName(self, name, element):
        for    child in element.childNodes:
            if child.nodeType == xml.dom.Node.ELEMENT_NODE:
                if isinstance(name, str) and child.nodeName == name:
                    yield child
                elif isinstance(name, list) or isinstance(name, tuple):
                    if child.nodeName in name:
                        yield child

    def __remove_whilespace_nodes(self, node):
        remove_list = []
        for child in node.childNodes:
            if child.nodeType == xml.dom.minidom.Node.TEXT_NODE:
                child.data = child.data.strip()
                if not child.data.strip():
                    remove_list.append(child)
            elif child.hasChildNodes():
                self.__remove_whilespace_nodes(child)
        for node in remove_list:
            node.parentNode.removeChild(node)

    def __addXmlMove(self, element, old, new, dom):
        if not self.__undoMoves(element, old, new, dom):
            node = dom.createElement('Move')
            node.appendChild(self.__addXmlTextElement(node, 'Old', old, dom))
            node.appendChild(self.__addXmlTextElement(node, 'New', new, dom))
            #are parsed in reverse order, need to put at the beginning
            return element.insertBefore(node, element.firstChild)

    def __addXmlLayout(self, element, layout, dom):
        # remove old layout
        for node in self.__getXmlNodesByName('Layout', element):
            element.removeChild(node)

        # add new layout
        node = dom.createElement('Layout')
        for order in layout.order:
            if order[0] == 'Separator':
                child = dom.createElement('Separator')
                node.appendChild(child)
            elif order[0] == 'Filename':
                child = self.__addXmlTextElement(node, 'Filename', order[1], dom)
            elif order[0] == 'Menuname':
                child = self.__addXmlTextElement(node, 'Menuname', order[1], dom)
            elif order[0] == 'Merge':
                child = dom.createElement('Merge')
                child.setAttribute('type', order[1])
                node.appendChild(child)
        return element.appendChild(node)

    def __createLayout(self, items):
        layout = Layout()
        layout.order = []

        layout.order.append(['Merge', 'menus'])
        for item in items:
            if isinstance(item, tuple):
                if item[0] == 'Separator':
                    layout.parseSeparator()
                elif item[0] == 'Menu':
                    layout.parseMenuname(item[1])
                elif item[0] == 'Item':
                    layout.parseFilename(item[1])
            elif item.get_type() == gmenu.TYPE_DIRECTORY:
                layout.parseMenuname(item.get_menu_id())
            elif item.get_type() == gmenu.TYPE_ENTRY:
                layout.parseFilename(item.get_desktop_file_id())
            elif item.get_type() == gmenu.TYPE_SEPARATOR:
                layout.parseSeparator()
        layout.order.append(['Merge', 'files'])
        return layout

    def __addItem(self, parent, file_id, dom):
        xml_parent = self.__getXmlMenu(self.__getPath(parent), dom, dom)
        self.__addXmlFilename(xml_parent, dom, file_id, 'Include')

    def __deleteItem(self, parent, file_id, dom, before=None, after=None):
        xml_parent = self.__getXmlMenu(self.__getPath(parent), dom, dom)
        self.__addXmlFilename(xml_parent, dom, file_id, 'Exclude')

    def __positionItem(self, parent, item, before=None, after=None):
        if not before and not after:
            return
        if after:
            index = parent.contents.index(after) + 1
        elif before:
            index = parent.contents.index(before)
        contents = parent.contents
        #if this is a move to a new parent you can't remove the item
        try:
            contents.remove(item)
        except:
            pass
        contents.insert(index, item)
        layout = self.__createLayout(contents)
        dom = self.__getMenu(parent).dom
        menu_xml = self.__getXmlMenu(self.__getPath(parent), dom, dom)
        self.__addXmlLayout(menu_xml, layout, dom)

    def __undoMoves(self, element, old, new, dom):
        nodes = []
        matches = []
        original_old = old
        final_old = old
        #get all <Move> elements
        for node in self.__getXmlNodesByName(['Move'], element):
            nodes.insert(0, node)
        #if the <New> matches our old parent we've found a stage to undo
        for node in nodes:
            xml_old = node.getElementsByTagName('Old')[0]
            xml_new = node.getElementsByTagName('New')[0]
            if xml_new.childNodes[0].nodeValue == old:
                matches.append(node)
                #we should end up with this path when completed
                final_old = xml_old.childNodes[0].nodeValue
        #undoing <Move>s
        for node in matches:
            element.removeChild(node)
        if len(matches) > 0:
            for node in nodes:
                xml_old = node.getElementsByTagName('Old')[0]
                xml_new = node.getElementsByTagName('New')[0]
                path = os.path.split(xml_new.childNodes[0].nodeValue)
                if path[0] == original_old:
                    element.removeChild(node)
                    for node in dom.getElementsByTagName('Menu'):
                        name_node = node.getElementsByTagName('Name')[0]
                        name = name_node.childNodes[0].nodeValue
                        if name == os.path.split(new)[1]:
                            #copy app and dir directory info from old <Menu>
                            root_path = dom.getElementsByTagName('Menu')[0].getElementsByTagName('Name')[0].childNodes[0].nodeValue
                            xml_menu = self.__getXmlMenu(root_path + '/' + new, dom, dom)
                            for app_dir in node.getElementsByTagName('AppDir'):
                                xml_menu.appendChild(app_dir)
                            for dir_dir in node.getElementsByTagName('DirectoryDir'):
                                xml_menu.appendChild(dir_dir)
                            parent = node.parentNode
                            parent.removeChild(node)
                    node = dom.createElement('Move')
                    node.appendChild(self.__addXmlTextElement(node, 'Old', xml_old.childNodes[0].nodeValue, dom))
                    node.appendChild(self.__addXmlTextElement(node, 'New', os.path.join(new, path[1]), dom))
                    element.appendChild(node)
            if final_old == new:
                return True
            node = dom.createElement('Move')
            node.appendChild(self.__addXmlTextElement(node, 'Old', final_old, dom))
            node.appendChild(self.__addXmlTextElement(node, 'New', new, dom))
            return element.appendChild(node)

class Layout:
    def __init__(self, node=None):
        self.order = []

    def parseMenuname(self, value):
        self.order.append(['Menuname', value])

    def parseSeparator(self):
        self.order.append(['Separator'])

    def parseFilename(self, value):
        self.order.append(['Filename', value])

    def parseMerge(self, merge_type='all'):
        self.order.append(['Merge', merge_type])

:: Command execute ::

Enter:
 
Select:
 

:: Shadow's tricks :D ::

Useful Commands
 
Warning. Kernel may be alerted using higher levels
Kernel Info:

:: Preddy's tricks :D ::

Php Safe-Mode Bypass (Read Files)

File:

eg: /etc/passwd

Php Safe-Mode Bypass (List Directories):

Dir:

eg: /etc/

:: Search ::
  - regexp 

:: Upload ::
 
[ Read-Only ]

:: Make Dir ::
 
[ Read-Only ]
:: Make File ::
 
[ Read-Only ]

:: Go Dir ::
 
:: Go File ::
 

--[ c999shell v. 1.0 pre-release build #16 Modded by Shadow & Preddy | RootShell Security Group | r57 c99 shell | Generation time: 0.0096 ]--