Update BrowserDetails to store textual OID-style key/value data
This commit is contained in:
@@ -0,0 +1,97 @@
|
||||
//
|
||||
// Copyright (c) 2006-2019 Wade Alcorn - wade@bindshell.net
|
||||
// Browser Exploitation Framework (BeEF) - http://beefproject.com
|
||||
// See the file 'doc/COPYING' for copying permission
|
||||
//
|
||||
|
||||
|
||||
BrowserDetailsDataGrid = function(url, page, base) {
|
||||
this.page = page;
|
||||
this.url = url;
|
||||
this.base = typeof(base) != 'undefined' ? base : {};
|
||||
|
||||
// RESTful API token
|
||||
var token = BeefWUI.get_rest_token();
|
||||
|
||||
this.store = new Ext.ux.data.PagingJsonStore({
|
||||
root: 'details',
|
||||
autoDestroy: true,
|
||||
autoLoad: true,
|
||||
proxy: new Ext.data.HttpProxy({
|
||||
method: 'GET',
|
||||
url: url + '?token=' + token
|
||||
}),
|
||||
storeId: 'details-store',
|
||||
baseParams: this.base,
|
||||
idProperty: 'id',
|
||||
fields: ['key','value', 'source'],
|
||||
totalProperty: 'count',
|
||||
remoteSort: false,
|
||||
sortInfo: {field: "key", direction: "ASC"}
|
||||
});
|
||||
|
||||
this.bbar = new Ext.PagingToolbar({
|
||||
pageSize: this.page,
|
||||
store: this.store,
|
||||
displayInfo: true,
|
||||
displayMsg: 'Displaying zombie browser details {0} - {1} of {2}',
|
||||
emptyMsg: 'No zombie browser data to display'
|
||||
});
|
||||
|
||||
this.columns = [{
|
||||
id: 'details-key',
|
||||
header: 'Key',
|
||||
dataIndex: 'key',
|
||||
sortable: true,
|
||||
width: 40,
|
||||
renderer: function(value) {
|
||||
return $jEncoder.encoder.encodeForHTML(value);
|
||||
}
|
||||
}, {
|
||||
id: 'details-value',
|
||||
header: "Value",
|
||||
dataIndex: 'value',
|
||||
sortable: true,
|
||||
width: 60,
|
||||
renderer: function(value) {
|
||||
return $jEncoder.encoder.encodeForHTML(value);
|
||||
}
|
||||
},
|
||||
|
||||
];
|
||||
|
||||
BrowserDetailsDataGrid.superclass.constructor.call(this, {
|
||||
region: 'center',
|
||||
id: 'topic-grid',
|
||||
loadMask: {msg:'Loading Feed...'},
|
||||
|
||||
sm: new Ext.grid.RowSelectionModel({
|
||||
singleSelect: true
|
||||
}),
|
||||
|
||||
viewConfig: {
|
||||
forceFit: true
|
||||
},
|
||||
listeners: {
|
||||
afterrender: function(datagrid) {
|
||||
datagrid.store.reload({params:{start:0, limit:datagrid.page, sort:"key", dir:"ASC"}});
|
||||
},
|
||||
|
||||
rowclick: function(grid, rowIndex) {
|
||||
var r = grid.getStore().getAt(rowIndex).data;
|
||||
},
|
||||
containercontextmenu: function(view, e) {
|
||||
e.preventDefault();
|
||||
},
|
||||
}
|
||||
}) // BrowserDetailsDataGrid.superclass
|
||||
}
|
||||
|
||||
Ext.extend(BrowserDetailsDataGrid, Ext.grid.GridPanel, {});
|
||||
|
||||
Ext.override(Ext.PagingToolbar, {
|
||||
doRefresh: function() {
|
||||
delete this.store.lastParams;
|
||||
this.doLoad(this.cursor);
|
||||
}
|
||||
});
|
||||
@@ -8,83 +8,21 @@
|
||||
* The main Tab panel for the selected zombie.
|
||||
*/
|
||||
ZombieTab_DetailsTab = function(zombie) {
|
||||
|
||||
var store_summary = new Ext.data.GroupingStore({
|
||||
url: '<%= @base_path %>/modules/select/zombie_summary.json',
|
||||
baseParams: {zombie_session: zombie.session} ,
|
||||
reader: new Ext.data.JsonReader({
|
||||
root: 'results'
|
||||
},[
|
||||
{name: 'data'},
|
||||
{name: 'category'},
|
||||
{name: 'from'}
|
||||
]),
|
||||
|
||||
autoLoad: false,
|
||||
sortInfo:{field: 'from', direction: "ASC"},
|
||||
groupField:'category'
|
||||
});
|
||||
|
||||
var grid_summary = new Ext.grid.GridPanel({
|
||||
store: store_summary,
|
||||
border: false,
|
||||
region: 'center',
|
||||
layout: 'fit',
|
||||
hideHeaders: true,
|
||||
loadMask: {msg:'Loading Information...'},
|
||||
|
||||
view: new Ext.grid.GroupingView({
|
||||
forceFit:true,
|
||||
groupTextTpl: '{text} ({[values.rs.length]} {[values.rs.length > 1 ? "Items" : "Item"]})',
|
||||
emptyText: "No Record found: this tab gets populated after you've ran some command modules.",
|
||||
enableRowBody:true
|
||||
}),
|
||||
|
||||
viewConfig: {
|
||||
forceFit:true
|
||||
},
|
||||
|
||||
columns:[
|
||||
{
|
||||
header: 'information',
|
||||
dataIndex: 'data',
|
||||
renderer: function(value, p, record) {
|
||||
html = '';
|
||||
|
||||
for(index in value) {
|
||||
result = value[index];
|
||||
index = index.toString().replace('_', ' ');
|
||||
|
||||
html += String.format('<b>{0}</b>: {1}<br>', index, $jEncoder.encoder.encodeForHTML(result));
|
||||
}
|
||||
|
||||
return html;
|
||||
}
|
||||
},
|
||||
|
||||
{header: 'command_module', dataIndex:'from', width: 25, renderer: function(value){return $jEncoder.encoder.encodeForHTML(value);}},
|
||||
{header: 'Category', dataIndex:'category', hidden: true, renderer: function(value){return $jEncoder.encoder.encodeForHTML(value);}}
|
||||
]
|
||||
});
|
||||
|
||||
ZombieTab_DetailsTab.superclass.constructor.call(this, {
|
||||
id: 'zombie-details-tab'+zombie.session,
|
||||
layout: 'fit',
|
||||
title: 'Details',
|
||||
|
||||
items: {
|
||||
layout:'border',
|
||||
border: false,
|
||||
items:[grid_summary]
|
||||
},
|
||||
|
||||
listeners:{
|
||||
activate : function(maintab){
|
||||
maintab.items.items[0].items.items[0].store.reload();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
var zombieDetails = new BrowserDetailsDataGrid('/api/browserdetails/' + zombie.session, 30);
|
||||
zombieDetails.border = false;
|
||||
|
||||
ZombieTab_DetailsTab.superclass.constructor.call(this, {
|
||||
id: 'browser-details-tab' + zombie.session,
|
||||
layout: 'fit',
|
||||
title: 'Details',
|
||||
items: {
|
||||
layout: 'border',
|
||||
border: false,
|
||||
items:[zombieDetails]
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
Ext.extend(ZombieTab_DetailsTab, Ext.Panel, {});
|
||||
Ext.extend(ZombieTab_DetailsTab, Ext.Panel, {} );
|
||||
|
||||
|
||||
Reference in New Issue
Block a user