radare/radare2-webui

View on GitHub
www/enyo/js/rightpanel.js

Summary

Maintainability
B
6 hrs
Test Coverage
function makelist(x) {
    var z = 'List of ' + x.length + '\n\n';
    for (var i = 0; i < x.length; i++)
        z += '<a style=\'color:yellow\' href=\'javascript:r2ui.opendis(' +
                 x[i].offset + ')\'>0x' + x[i].offset.toString(16) + '</a>  ' + enyo.dom.escape(x[i].name) + '\n';
    return z;
}

enyo.kind({
    name: 'RightPanel',
    style: 'background-color:#404040;',
    classes: 'onyx-toolbar',
    kind: 'FittableRows',
    ra: null,
    components: [
        {kind: 'FittableColumns', style: 'margin-bottom:5px', components: [
        {kind: 'onyx.Button', content: '[', ontap: 'closeSidebar', style: 'padding:8px;margin-right:8px'},
            {onup: 'toggleScroll', style: 'position:absolute;left:40px;top:0px;', kind: 'onyx.MenuDecorator', onSelect: 'itemSelected', components: [
                {content: 'List elements' },
                {kind: 'onyx.Menu', showOnTop: true, maxHeight: 290, name: 'menu', style: 'height:300px', components: [
                    {content: 'flags', value: '2'},
                    {content: 'flagspaces', value: '2'},
                    {classes: 'onyx-menu-divider'},
                    {content: 'strings', value: '1'},
                    {content: 'symbols', value: '1'},
                    {content: 'imports', value: '1'},
                    {content: 'relocs', value: '1'},
                    {content: 'functions', value: '1'},
                    {content: 'comments', value: '1'},
                    {classes: 'onyx-menu-divider'},
                    {content: 'registers', value: '1'},
                    {content: 'stack', value: '2'},
                    {content: 'backtrace', value: '3'}
                ]}
            ]}
        ]},
        {kind: 'Scroller', animated: false, fit: true, horizontal: false, name: 'scroll', components: [
/*
    {kind: "FittableColumns",components:[
            {kind: "List", name: "list", style:"height:400px", realtimeFit:true, onSetupItem: "setupItem", components: [
                {kind: "onyx.Item", layoutKind: "HFlexLayout", style:"padding:0px", components: [
                    {name:"separator", tag: "hr", style:"height:1px;visibility:hidden"},
                    {kind: "onyx.Button", name: "msg", style: "width:100%", fit:true, active: true, ontap: "rowTap"}
                ]}
            ]},
        ]},
*/
            {tag: 'pre', style: 'font-size:14px', allowHtml: true, name: 'output', content: '..' }
        ]}
    ],
    toggleScroll: function() {
        var is_visible = this.$.menu.getShowing();
        this.$.scroll.setShowing(is_visible);
    },
    rowTap: function() {
        /* do something here */
    },
    create: function() {
        this.inherited(arguments);
        /*
                this.$.list.setCount (3);
                this.$.list.refresh();
        */
    },
    data: [],
    setupItem: function(inSender, inIndex) {
        var item = this.data[inIndex.index];
        if (!item)
            return false;
        var msg = item.name + ' ' + item.offset;
        console.log(msg);
        this.$.msg.setContent(msg);
        return true;
    },
    refresh: function() {
        //this.$.list.setCount (this.data.length);
        //this.$.list.refresh ();
    },
    itemSelected: function(inSender, inEvent) {
        var self = this;
        var selected = inEvent.originator.content;
        var is_visible = this.$.menu.getShowing();
        r2ui.rp = self;
        this.$.scroll.setShowing(!!!is_visible);
        this.$.menu.setShowing(false);
        this.$.scroll.scrollToTop();
        //this.$.output.scrollToTop();
        switch (selected) {
        case 'comments':
            r2.cmd('CC*', function(x) {
                x = x.replace(/0x([a-zA-Z0-9]*)/g, '<a style=\'color:yellow\' href=\'javascript:r2ui.seek("0x$1")\'>0x$1</a>');
                self.$.output.setContent(x);
            });
            break;
        case 'functions':
            r2.cmd('afl', function(x) {
                x = x.replace(/0x([a-zA-Z0-9]*)/g, '<a style=\'color:yellow\' href=\'javascript:r2ui.seek("0x$1")\'>0x$1</a>');
                self.$.output.setContent(x);
            });
            break;
        case 'flagspaces':
            this.updateFlagspace();
            break;
        case 'strings':
            r2.cmd('izj', function(x) {
                var s = JSON.parse(x);
                var h = '';
                for (var i in s) {
                    var off = (+s[i]['offset']).toString(16);
                    h += '<a style="color:yellow" href="javascript:r2ui.opendis(0x' +
                    off + ')">0x' + off + '</a> ' + enyo.dom.escape(s[i]['string']) + '<br />';
                }
                self.$.output.setContent(h);
            });
            break;
        case 'sections':
            r2.bin_sections(function(x) {
                self.$.output.setContent(makelist(x));
            });
            break;
        case 'symbols':
            r2.bin_symbols(function(x) {
                self.$.output.setContent(makelist(x));
            });
            break;
        case 'relocs':
            r2.bin_relocs(function(x) {
                self.$.output.setContent(makelist(x));
            });
            break;
        case 'imports':
            r2.bin_imports(function(x) {
                self.$.output.setContent(makelist(x));
            });
            break;
        case 'flags':
            r2.get_flags(function(flags) {
                self.data = flags;
                self.$.output.setContent(makelist(flags));
                self.refresh();
            });
            break;
    }
    },
    closeSidebar: function() {
        this.ra.setIndex(1);
    },
    selectFlagspace: function(x) {
        r2.cmd('fs ' + x, function() {
            r2ui.rp.updateFlagspace();
        });
    },
    updateFlagspace: function() {
            var self = r2ui.rp;
            r2.cmd('fsj', function(x) {
                var s = JSON.parse(x);
                var h = '';
                for (var i in s) {
                    var nam = s[i].name;
                    var sel = s[i].selected;
                    h += '<a style="color:yellow" href="javascript:r2ui.rp.selectFlagspace(\'' +
                        nam + '\')">' + nam + '</a> ' + (sel ? '  (selected)' : '') + '<br />';
                }
                self.$.output.setContent(h);
            });
        }
});