more table fixes

TreeView auto layout
	TreeView reload on main thread, etc

beginnings of VT integrations
This commit is contained in:
Patrick Wardle
2015-06-20 18:29:30 -10:00
parent df5bba18e6
commit 014f70da94
15 changed files with 419 additions and 185 deletions
+28 -41
View File
@@ -89,7 +89,7 @@
//filterObj = [[Filter alloc] init];
//init virus total object
//virusTotalObj = [[VirusTotal alloc] init];
virusTotalObj = [[VirusTotal alloc] init];
//init array for virus total threads
//vtThreads = [NSMutableArray array];
@@ -329,11 +329,7 @@
{
//alloc/init
taskTableController = [[TaskTableController alloc] initWithNibName:@"FlatView" bundle:nil];
/*if(self.taskTableController != nil)
{
//update iVar
self.currentViewController = self.taskTableController;
}*/
break;
}
case TREE_VIEW:
@@ -341,13 +337,6 @@
//alloc/init
taskTableController = [[TaskTableController alloc] initWithNibName:@"TreeView" bundle:nil];
/*if(self.taskTableController != nil)
{
//update iVar
self.currentViewController = self.taskTableController;
}*/
break;
}
}
@@ -361,16 +350,19 @@
return;
}
//TODO: add checks to make sure or handle switch to tree view!!!!
//reload (to re-draw) a specific row in table
-(void)reloadRow:(Task*)task item:(ItemBase*)item pane:(NSUInteger)pane
{
//table view
NSTableView* tableView = nil;
__block NSTableView* tableView = nil;
//row
NSUInteger row = 0;
__block NSUInteger row = 0;
//run everything on main thread
// ->ensures table view isn't changed out from under us....
dispatch_async(dispatch_get_main_queue(), ^{
//top table (pane)
if(PANE_TOP == pane)
{
@@ -390,20 +382,15 @@
goto bail;
}
//reload just the row
// ->on main thread
dispatch_async(dispatch_get_main_queue(), ^{
//begin updates
[tableView beginUpdates];
//reload row
[tableView reloadDataForRowIndexes:[NSIndexSet indexSetWithIndex:(row)] columnIndexes:[NSIndexSet indexSetWithIndex:0]];
//end updates
[tableView endUpdates];
});
//begin updates
[tableView beginUpdates];
//reload row
[tableView reloadDataForRowIndexes:[NSIndexSet indexSetWithIndex:(row)] columnIndexes:[NSIndexSet indexSetWithIndex:0]];
//end updates
[tableView endUpdates];
}
//reload item
// ->tree view
@@ -411,10 +398,10 @@
{
//begin updates
[tableView beginUpdates];
//reload
[(NSOutlineView*)tableView reloadItem:task];
//end updates
[tableView endUpdates];
}
@@ -427,6 +414,9 @@
//bail
bail:
;
}); //dispatch on main thread
return;
}
@@ -438,20 +428,14 @@ bail:
//tag
NSUInteger segmentTag = 0;
/*
if(YES == [task.binary.name isEqualToString:@"launchd"])
{
NSLog(@"asdf");
}*/
//get segment tag
segmentTag = [[self.bottomPaneBtn selectedCell] tagForSegment:[self.bottomPaneBtn selectedSegment]];
//ignore reloads for unselected tasks
if(self.currentTask != task)
// ->note: when no task is passed in, always reload though
if( (nil != task) &&
(self.currentTask != task))
{
//NSLog(@"selected task: %@ not match %@", self.currentTask.binary.name, task.binary.name);
//ignore
goto bail;
}
@@ -1321,6 +1305,9 @@ bail:
//reload top pane
[self reloadTaskTable];
//select top row
[self.taskTableController.itemView selectRowIndexes:[NSIndexSet indexSetWithIndex:0] byExtendingSelection:NO];
return;
}
+19
View File
@@ -489,6 +489,9 @@ NSTableCellView* createTaskView(NSTableView* tableView, id owner, Task* task)
//task's name frame
CGRect nameFrame = {0};
//task's path frame
CGRect pathFrame = {0};
//sanity check
if(nil == task.binary)
{
@@ -552,6 +555,22 @@ NSTableCellView* createTaskView(NSTableView* tableView, id owner, Task* task)
// ->immediately follows name
[((NSTextField*)[taskCell viewWithTag:TABLE_ROW_PID_LABEL]) setStringValue:[NSString stringWithFormat:@"(%@)", task.pid]];
/*
//outline view has indentations
// ->adjust path width to account for this
if(YES == [tableView isKindOfClass:[NSOutlineView class]])
{
//get path frame
pathFrame = ((NSTextField*)[tableView viewWithTag:TABLE_ROW_SUB_TEXT_TAG]).frame;
//subtract indendtation for level
pathFrame.size.width -= [(NSOutlineView*) tableView levelForItem:task];
//set path frame
((NSTextField*)[tableView viewWithTag:TABLE_ROW_SUB_TEXT_TAG]).frame = pathFrame;
}
*/
//set path
[[taskCell viewWithTag:TABLE_ROW_SUB_TEXT_TAG] setStringValue:task.binary.path];
-11
View File
@@ -50,17 +50,7 @@
//grab attributes
//self.attributes = [[NSFileManager defaultManager] attributesOfItemAtPath:self.path error:nil];
//do this in bg!
//set signing info
//self.signingInfo = extractSigningInfo(self.path);
//computes hashes
// ->set 'md5' and 'sha1' iVars
//self.hashes = hashFile(self.path);
//call into filter object to check if file is known
// ->apple-signed or whitelisted
//self.isTrusted = [((AppDelegate*)[[NSApplication sharedApplication] delegate]).filterObj isTrustedFile:self];
@@ -165,7 +155,6 @@ bail:
return taskIcon;
}
//TODO: green signing for apple!!!
//get signing info (which takes a while to generate)
// ->this method should be called in the background
-(void)generatedSigningInfo
+2
View File
@@ -25,6 +25,8 @@
}
/* PROPERTIES */
//event queue
@property(retain, atomic)NSMutableArray* eventQueue;
+19 -6
View File
@@ -9,6 +9,7 @@
#import "Queue.h"
#import "Consts.h"
#import "Binary.h"
#import "VirusTotal.h"
#import "AppDelegate.h"
@implementation Queue
@@ -50,6 +51,12 @@
// ->don't want UI thread, etc to suffer
[NSThread sleepForTimeInterval:5.0f];
//VT object
VirusTotal* vtObject = nil;
//grab VT object
vtObject = ((AppDelegate*)[[NSApplication sharedApplication] delegate]).virusTotalObj;
//for ever
while(YES)
{
@@ -69,15 +76,21 @@
//get item off queue
binary = [eventQueue dequeue];
//process binary
// ->hash, etc
if(YES == [binary isKindOfClass:[Binary class]])
//sanity check
if(YES != [binary isKindOfClass:[Binary class]])
{
//process
//->for now, just hash, etc
[binary generateDetailedInfo];
//ignore
continue;
}
//process
//->for now, just hash, etc
[binary generateDetailedInfo];
//add item for VT processing
[vtObject addItem:binary];
//unlock
[self.queueCondition unlock];
+7 -1
View File
@@ -44,6 +44,8 @@
@synthesize arguments;
@synthesize connections;
//TODO: make sure we only check signature of binary once!!!
//init w/ a pid + path
// note: time consuming init's are done in '' method
-(id)initWithPID:(NSNumber*)taskPID andPath:(NSString*)taskPath
@@ -112,6 +114,10 @@
// ->this will processing
[((AppDelegate*)[[NSApplication sharedApplication] delegate]).taskEnumerator.binaryQueue enqueue:self.binary];
//add to VT queue
// ->this will trigger background submission to VT
[((AppDelegate*)[[NSApplication sharedApplication] delegate]).taskEnumerator.binaryQueue enqueue:self.binary];
//add it to 'global' list
existingBinaries[taskPath] = self.binary;
@@ -376,7 +382,7 @@ bail:
}
//add to queue
// ->this will processing
// ->this will trigger background processing
[((AppDelegate*)[[NSApplication sharedApplication] delegate]).taskEnumerator.binaryQueue enqueue:dylib];
//add to list of new dylibs
+2 -3
View File
@@ -38,12 +38,11 @@
//TODO: weak OK?
@property (nonatomic, retain) NSXPCConnection* xpcConnection;
//queue object
// ->contains watch items that should be processed
//queue
// ->contains binaries that should be processed
@property (nonatomic, retain) Queue* binaryQueue;
/* METHODS */
//enumerate all tasks
+1
View File
@@ -87,6 +87,7 @@
//init binary processing queue
binaryQueue = [[Queue alloc] init];
}
return self;
@@ -36,11 +36,11 @@
ignoreCount = "0"
continueAfterRunningActions = "No"
filePath = "AppDelegate.m"
timestampString = "456474906.073599"
timestampString = "456541711.785304"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "671"
endingLineNumber = "671"
startingLineNumber = "661"
endingLineNumber = "661"
landmarkName = "-reloadTaskTable"
landmarkType = "5">
</BreakpointContent>
@@ -115,15 +115,57 @@
shouldBeEnabled = "No"
ignoreCount = "0"
continueAfterRunningActions = "No"
filePath = "AppDelegate.m"
timestampString = "456474979.625707"
filePath = "ItemView.m"
timestampString = "456521289.11776"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "416"
endingLineNumber = "416"
landmarkName = "-reloadRow:item:pane:"
startingLineNumber = "484"
endingLineNumber = "484"
landmarkName = "createTaskView()"
landmarkType = "7">
</BreakpointContent>
</BreakpointProxy>
<BreakpointProxy
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
<BreakpointContent
shouldBeEnabled = "No"
ignoreCount = "0"
continueAfterRunningActions = "No"
filePath = "TaskTableController.m"
timestampString = "456521744.657881"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "934"
endingLineNumber = "934"
landmarkName = "-showInfo:"
landmarkType = "5">
</BreakpointContent>
</BreakpointProxy>
<BreakpointProxy
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
<BreakpointContent
shouldBeEnabled = "No"
ignoreCount = "0"
continueAfterRunningActions = "No"
filePath = "AppDelegate.m"
timestampString = "456521776.780775"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "317"
endingLineNumber = "317"
landmarkName = "-changeViewController"
landmarkType = "5">
</BreakpointContent>
</BreakpointProxy>
<BreakpointProxy
BreakpointExtensionID = "Xcode.Breakpoint.SymbolicBreakpoint">
<BreakpointContent
shouldBeEnabled = "Yes"
ignoreCount = "0"
continueAfterRunningActions = "No"
symbolName = "objc_exception_throw"
moduleName = "">
</BreakpointContent>
</BreakpointProxy>
</Breakpoints>
</Bucket>
+12 -10
View File
@@ -18,9 +18,9 @@
<rect key="frame" x="0.0" y="0.0" width="1306" height="294"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<scrollView ambiguous="YES" misplaced="YES" autohidesScrollers="YES" horizontalLineScroll="42" horizontalPageScroll="10" verticalLineScroll="42" verticalPageScroll="10" usesPredominantAxisScrolling="NO" horizontalScrollElasticity="none" verticalScrollElasticity="none" translatesAutoresizingMaskIntoConstraints="NO" id="QDh-31-mfl">
<rect key="frame" x="-3" y="20" width="1300" height="274"/>
<clipView key="contentView" ambiguous="YES" misplaced="YES" drawsBackground="NO" id="t1U-m3-CeJ">
<scrollView autohidesScrollers="YES" horizontalLineScroll="42" horizontalPageScroll="10" verticalLineScroll="42" verticalPageScroll="10" usesPredominantAxisScrolling="NO" horizontalScrollElasticity="none" verticalScrollElasticity="none" translatesAutoresizingMaskIntoConstraints="NO" id="QDh-31-mfl">
<rect key="frame" x="0.0" y="0.0" width="1306" height="294"/>
<clipView key="contentView" drawsBackground="NO" id="t1U-m3-CeJ">
<rect key="frame" x="1" y="1" width="1204" height="437"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
@@ -31,7 +31,7 @@
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
<color key="gridColor" name="gridColor" catalog="System" colorSpace="catalog"/>
<tableColumns>
<tableColumn identifier="MainCell" editable="NO" width="1295" minWidth="40" maxWidth="2000" id="sUM-Cl-ag5">
<tableColumn identifier="MainCell" editable="NO" width="1301" minWidth="40" maxWidth="2000" id="sUM-Cl-ag5">
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border" alignment="left">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
@@ -45,7 +45,7 @@
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/>
<prototypeCellViews>
<tableCellView identifier="TaskCell" id="sdY-t5-tbW" customClass="kkRowCell">
<rect key="frame" x="1" y="1" width="1295" height="40"/>
<rect key="frame" x="1" y="1" width="1301" height="40"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<imageView ambiguous="YES" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="cG6-PF-La2">
@@ -185,7 +185,7 @@
</connections>
</tableCellView>
<tableCellView identifier="DylibCell" id="AMp-Sl-IUz" customClass="kkRowCell">
<rect key="frame" x="1" y="1" width="1295" height="40"/>
<rect key="frame" x="1" y="43" width="1301" height="40"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" misplaced="YES" tag="100" translatesAutoresizingMaskIntoConstraints="NO" id="bgG-DR-RMT">
@@ -302,7 +302,7 @@
</connections>
</tableCellView>
<tableCellView identifier="FileCell" id="zC6-7V-PKY" customClass="kkRowCell">
<rect key="frame" x="1" y="1" width="1295" height="40"/>
<rect key="frame" x="1" y="85" width="1301" height="40"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="LkX-uS-hKH">
@@ -385,7 +385,7 @@
</connections>
</tableCellView>
<tableCellView identifier="NetworkCell" id="vkh-K9-CiP" customClass="kkRowCell">
<rect key="frame" x="1" y="1" width="1295" height="40"/>
<rect key="frame" x="1" y="127" width="1301" height="40"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<imageView ambiguous="YES" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="n84-aN-dS4">
@@ -471,8 +471,10 @@
</scrollView>
</subviews>
<constraints>
<constraint firstItem="QDh-31-mfl" firstAttribute="leading" secondItem="T1P-b9-TzF" secondAttribute="leading" id="XxZ-TH-o2t"/>
<constraint firstAttribute="trailing" secondItem="QDh-31-mfl" secondAttribute="trailing" id="Z3y-5B-K5h"/>
<constraint firstItem="QDh-31-mfl" firstAttribute="leading" secondItem="T1P-b9-TzF" secondAttribute="leading" id="AMO-iw-hlh"/>
<constraint firstAttribute="trailing" secondItem="QDh-31-mfl" secondAttribute="trailing" id="C3S-5N-41z"/>
<constraint firstItem="QDh-31-mfl" firstAttribute="top" secondItem="T1P-b9-TzF" secondAttribute="top" id="ouv-e6-7Mv"/>
<constraint firstAttribute="bottom" secondItem="QDh-31-mfl" secondAttribute="bottom" id="t31-0J-wLa"/>
</constraints>
<point key="canvasLocation" x="638" y="-658"/>
</view>
+80 -67
View File
@@ -15,12 +15,12 @@
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
<view id="T1P-b9-TzF">
<rect key="frame" x="0.0" y="0.0" width="1306" height="294"/>
<rect key="frame" x="0.0" y="0.0" width="1326" height="294"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<scrollView fixedFrame="YES" borderType="line" autohidesScrollers="YES" horizontalLineScroll="42" horizontalPageScroll="10" verticalLineScroll="42" verticalPageScroll="10" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="mTr-W0-MgJ">
<rect key="frame" x="0.0" y="0.0" width="1306" height="294"/>
<clipView key="contentView" misplaced="YES" id="Sbm-Z7-NmT">
<scrollView borderType="none" autohidesScrollers="YES" horizontalLineScroll="42" horizontalPageScroll="10" verticalLineScroll="42" verticalPageScroll="10" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="mTr-W0-MgJ">
<rect key="frame" x="0.0" y="0.0" width="1326" height="294"/>
<clipView key="contentView" id="Sbm-Z7-NmT">
<rect key="frame" x="1" y="17" width="238" height="117"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
@@ -31,7 +31,7 @@
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
<color key="gridColor" name="gridColor" catalog="System" colorSpace="catalog"/>
<tableColumns>
<tableColumn identifier="MainCell" editable="NO" width="1301" minWidth="40" maxWidth="2000" id="cLW-QZ-CYz">
<tableColumn identifier="MainCell" editable="NO" width="1323" minWidth="40" maxWidth="2000" id="cLW-QZ-CYz">
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border" alignment="left">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
@@ -44,117 +44,123 @@
</textFieldCell>
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/>
<prototypeCellViews>
<tableCellView identifier="TaskCell" id="7xB-nb-n5O" customClass="kkRowCell">
<rect key="frame" x="1" y="1" width="1295" height="40"/>
<tableCellView identifier="TaskCell" id="0gS-xR-4Le" customClass="kkRowCell">
<rect key="frame" x="1" y="1" width="1323" height="40"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<imageView ambiguous="YES" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="DMw-xR-BeB">
<imageView ambiguous="YES" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="jvS-nx-JhV">
<rect key="frame" x="5" y="9" width="26" height="23"/>
<constraints>
<constraint firstAttribute="height" constant="20" id="N3v-eG-0fM"/>
<constraint firstAttribute="width" constant="20" id="ZmE-rN-Aa2"/>
<constraint firstAttribute="height" constant="20" id="JG0-YO-VuW"/>
<constraint firstAttribute="width" constant="20" id="tpf-23-jVo"/>
</constraints>
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="NSActionTemplate" id="I2b-0v-y6D"/>
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="NSActionTemplate" id="etl-5j-9jq"/>
</imageView>
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" misplaced="YES" tag="100" translatesAutoresizingMaskIntoConstraints="NO" id="839-dJ-gQp">
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" misplaced="YES" tag="100" translatesAutoresizingMaskIntoConstraints="NO" id="9gt-zP-HcU">
<rect key="frame" x="33" y="23" width="11" height="11"/>
<constraints>
<constraint firstAttribute="height" constant="11" id="1Kh-hp-YgV"/>
<constraint firstAttribute="width" constant="11" id="WKY-rc-A7v"/>
<constraint firstAttribute="height" constant="11" id="5GF-hE-7IQ"/>
<constraint firstAttribute="width" constant="11" id="vF5-K5-3sp"/>
</constraints>
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="unknown" id="cl5-Gt-HMs"/>
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="unknown" id="NpX-cl-Gla"/>
</imageView>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" ambiguous="YES" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="oWx-jq-02H">
<rect key="frame" x="46" y="20" width="225" height="18"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" selectable="YES" allowsUndo="NO" sendsActionOnEndEditing="YES" title="Item Name" id="Z6I-g2-cup">
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" ambiguous="YES" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="ni5-tf-iVs">
<rect key="frame" x="46" y="20" width="225" height="19"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" selectable="YES" allowsUndo="NO" sendsActionOnEndEditing="YES" title="Task Name" id="r98-jB-kwQ">
<font key="font" size="13" name="Menlo-Regular"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<button toolTip="show in finder" verticalHuggingPriority="750" ambiguous="YES" misplaced="YES" tag="107" translatesAutoresizingMaskIntoConstraints="NO" id="6f3-ri-fbE">
<rect key="frame" x="1263" y="17" width="15" height="15"/>
<button toolTip="show in finder" verticalHuggingPriority="750" ambiguous="YES" misplaced="YES" tag="107" translatesAutoresizingMaskIntoConstraints="NO" id="0m7-AT-Eya">
<rect key="frame" x="1288" y="17" width="15" height="15"/>
<constraints>
<constraint firstAttribute="width" constant="15" id="Mza-vw-e2F"/>
<constraint firstAttribute="height" constant="15" id="qqU-cb-eBX"/>
<constraint firstAttribute="width" constant="15" id="Tdr-QH-P2k"/>
<constraint firstAttribute="height" constant="15" id="hTD-dI-cC7"/>
</constraints>
<buttonCell key="cell" type="bevel" bezelStyle="regularSquare" image="show" imagePosition="only" alignment="center" alternateImage="showBG" state="on" imageScaling="proportionallyDown" inset="2" id="cy3-S9-iUc">
<buttonCell key="cell" type="bevel" bezelStyle="regularSquare" image="show" imagePosition="only" alignment="center" alternateImage="showBG" state="on" imageScaling="proportionallyDown" inset="2" id="9bk-bJ-Zyz">
<behavior key="behavior" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="showInFinder:" target="-2" id="CAb-np-amK"/>
</connections>
</button>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" ambiguous="YES" misplaced="YES" tag="108" translatesAutoresizingMaskIntoConstraints="NO" id="Wjv-b4-LpE">
<rect key="frame" x="1259" y="4" width="25" height="12"/>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" ambiguous="YES" misplaced="YES" tag="108" translatesAutoresizingMaskIntoConstraints="NO" id="201-Tu-53I">
<rect key="frame" x="1284" y="4" width="25" height="12"/>
<constraints>
<constraint firstAttribute="width" constant="25" id="IdA-gX-1SJ"/>
<constraint firstAttribute="height" constant="12" id="mEP-zn-5P5"/>
<constraint firstAttribute="height" constant="12" id="jHX-lT-h6b"/>
<constraint firstAttribute="width" constant="25" id="scr-lN-iDR"/>
</constraints>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="center" title="show" id="Ypq-tG-G2w">
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="center" title="show" id="9sw-0n-acD">
<font key="font" size="9" name="Menlo-Regular"/>
<color key="textColor" white="0.5" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" ambiguous="YES" misplaced="YES" tag="101" translatesAutoresizingMaskIntoConstraints="NO" id="vl6-B3-YnP">
<rect key="frame" x="31" y="2" width="1093" height="21"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" selectable="YES" allowsUndo="NO" sendsActionOnEndEditing="YES" title="item path" id="IxF-8j-bl0">
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" ambiguous="YES" misplaced="YES" tag="101" translatesAutoresizingMaskIntoConstraints="NO" id="IPo-Hz-FA1">
<rect key="frame" x="31" y="2" width="1138" height="21"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" selectable="YES" allowsUndo="NO" sendsActionOnEndEditing="YES" title="item path" id="e1S-Fc-Tv3">
<font key="font" size="11" name="Menlo-Regular"/>
<color key="textColor" white="0.5" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<button toolTip="show virustotal info" verticalHuggingPriority="750" ambiguous="YES" misplaced="YES" tag="103" translatesAutoresizingMaskIntoConstraints="NO" id="4A1-v1-fqF" customClass="VTButton">
<rect key="frame" x="1155" y="17" width="49" height="20"/>
<button toolTip="show virustotal info" verticalHuggingPriority="750" ambiguous="YES" misplaced="YES" tag="103" translatesAutoresizingMaskIntoConstraints="NO" id="e66-L1-kbk" customClass="VTButton">
<rect key="frame" x="1180" y="17" width="49" height="20"/>
<constraints>
<constraint firstAttribute="height" constant="29" id="81l-Vw-eYi"/>
<constraint firstAttribute="width" constant="49" id="Tsp-mH-sb0"/>
<constraint firstAttribute="height" constant="29" id="Mgz-uL-nCb"/>
<constraint firstAttribute="width" constant="49" id="P8B-TA-LLC"/>
</constraints>
<buttonCell key="cell" type="bevel" title="▪ ▪ ▪" bezelStyle="regularSquare" imagePosition="overlaps" alignment="center" enabled="NO" refusesFirstResponder="YES" state="on" imageScaling="proportionallyDown" inset="2" id="7Ff-Cs-4HN">
<buttonCell key="cell" type="bevel" title="▪ ▪ ▪" bezelStyle="regularSquare" imagePosition="overlaps" alignment="center" enabled="NO" refusesFirstResponder="YES" state="on" imageScaling="proportionallyDown" inset="2" id="4qh-Lz-P1y">
<behavior key="behavior" lightByContents="YES"/>
<font key="font" size="8" name="Menlo-Bold"/>
</buttonCell>
</button>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" ambiguous="YES" misplaced="YES" tag="104" translatesAutoresizingMaskIntoConstraints="NO" id="NKv-qJ-K0K">
<rect key="frame" x="1148" y="4" width="65" height="12"/>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" ambiguous="YES" misplaced="YES" tag="104" translatesAutoresizingMaskIntoConstraints="NO" id="Ljf-ew-dFy">
<rect key="frame" x="1173" y="4" width="65" height="12"/>
<constraints>
<constraint firstAttribute="width" constant="61" id="BhB-I3-B9j"/>
<constraint firstAttribute="height" constant="12" id="Lvp-ST-Nn4"/>
<constraint firstAttribute="height" constant="12" id="JGS-Et-SPS"/>
<constraint firstAttribute="width" constant="61" id="zYx-CW-ywf"/>
</constraints>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="center" title="virustotal" id="6oc-VM-LLN">
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="center" title="virustotal" id="ydA-bL-6w3">
<font key="font" size="9" name="Menlo-Regular"/>
<color key="textColor" white="0.5" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<button toolTip="show file info" verticalHuggingPriority="750" ambiguous="YES" misplaced="YES" tag="105" translatesAutoresizingMaskIntoConstraints="NO" id="DJD-ri-L1B">
<rect key="frame" x="1226" y="17" width="15" height="15"/>
<button toolTip="show file info" verticalHuggingPriority="750" ambiguous="YES" misplaced="YES" tag="105" translatesAutoresizingMaskIntoConstraints="NO" id="Kpb-Mz-fbz">
<rect key="frame" x="1251" y="17" width="15" height="15"/>
<constraints>
<constraint firstAttribute="height" constant="15" id="OjK-9U-ZN2"/>
<constraint firstAttribute="width" constant="15" id="VnG-o4-pT8"/>
<constraint firstAttribute="height" constant="15" id="4EE-js-ecq"/>
<constraint firstAttribute="width" constant="15" id="kAe-AG-RWR"/>
</constraints>
<buttonCell key="cell" type="bevel" bezelStyle="regularSquare" image="info" imagePosition="only" alignment="center" alternateImage="infoBG" state="on" imageScaling="proportionallyDown" inset="2" id="Pt4-bk-dHy">
<buttonCell key="cell" type="bevel" bezelStyle="regularSquare" image="info" imagePosition="only" alignment="center" alternateImage="infoBG" state="on" imageScaling="proportionallyDown" inset="2" id="3jg-7d-Ojq">
<behavior key="behavior" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="showInfo:" target="-2" id="omu-v2-CR6"/>
</connections>
</button>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" ambiguous="YES" misplaced="YES" tag="106" translatesAutoresizingMaskIntoConstraints="NO" id="66d-28-HRc">
<rect key="frame" x="1220" y="4" width="25" height="12"/>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" ambiguous="YES" misplaced="YES" tag="106" translatesAutoresizingMaskIntoConstraints="NO" id="JeZ-sa-j9F">
<rect key="frame" x="1245" y="4" width="25" height="12"/>
<constraints>
<constraint firstAttribute="height" constant="12" id="U1Q-a7-1C4"/>
<constraint firstAttribute="height" constant="12" id="Ttb-1N-NaM"/>
</constraints>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="center" title="info" id="D2L-sc-I1J">
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="center" title="info" id="BB8-fC-DkZ">
<font key="font" size="9" name="Menlo-Regular"/>
<color key="textColor" white="0.5" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" ambiguous="YES" misplaced="YES" tag="102" translatesAutoresizingMaskIntoConstraints="NO" id="bxk-nY-Ojx">
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" ambiguous="YES" misplaced="YES" tag="102" translatesAutoresizingMaskIntoConstraints="NO" id="QSB-ts-KGS">
<rect key="frame" x="295" y="20" width="79" height="18"/>
<constraints>
<constraint firstAttribute="width" constant="75" id="QKJ-lc-9uH"/>
<constraint firstAttribute="height" constant="18" id="lqD-mH-tWl"/>
<constraint firstAttribute="height" constant="18" id="J90-1c-W7r"/>
<constraint firstAttribute="width" constant="75" id="L3W-2u-h1F"/>
</constraints>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="pid" id="yDx-Lo-cYE">
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="pid" id="5Ph-yX-Xgt">
<font key="font" size="13" name="Menlo-Regular"/>
<color key="textColor" white="0.49295236009999999" alpha="0.84999999999999998" colorSpace="calibratedWhite"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
@@ -162,20 +168,21 @@
</textField>
</subviews>
<constraints>
<constraint firstItem="6f3-ri-fbE" firstAttribute="leading" secondItem="DJD-ri-L1B" secondAttribute="trailing" constant="20" id="62I-6i-bdJ"/>
<constraint firstItem="66d-28-HRc" firstAttribute="leading" secondItem="NKv-qJ-K0K" secondAttribute="trailing" constant="9" id="D01-9Y-AMk"/>
<constraint firstItem="DMw-xR-BeB" firstAttribute="leading" secondItem="7xB-nb-n5O" secondAttribute="leading" constant="5" id="EEt-PD-0zF"/>
<constraint firstItem="bxk-nY-Ojx" firstAttribute="leading" secondItem="oWx-jq-02H" secondAttribute="trailing" constant="8" id="IP5-Ta-1Bu"/>
<constraint firstItem="4A1-v1-fqF" firstAttribute="leading" secondItem="vl6-B3-YnP" secondAttribute="trailing" constant="8" id="VbZ-DW-ip1"/>
<constraint firstItem="vl6-B3-YnP" firstAttribute="leading" secondItem="DMw-xR-BeB" secondAttribute="trailing" constant="8" id="gVM-E6-C5n"/>
<constraint firstAttribute="trailing" secondItem="Wjv-b4-LpE" secondAttribute="trailing" constant="4" id="nBr-zQ-aVu"/>
<constraint firstAttribute="trailing" secondItem="6f3-ri-fbE" secondAttribute="trailing" constant="10" id="nNS-um-ew2"/>
<constraint firstItem="Wjv-b4-LpE" firstAttribute="leading" secondItem="66d-28-HRc" secondAttribute="trailing" constant="10" id="qg8-JA-AGc"/>
<constraint firstItem="DJD-ri-L1B" firstAttribute="leading" secondItem="4A1-v1-fqF" secondAttribute="trailing" constant="18" id="qrS-aQ-C2c"/>
<constraint firstItem="QSB-ts-KGS" firstAttribute="leading" secondItem="ni5-tf-iVs" secondAttribute="trailing" constant="8" id="2Q3-uZ-8AD"/>
<constraint firstItem="Kpb-Mz-fbz" firstAttribute="leading" secondItem="e66-L1-kbk" secondAttribute="trailing" constant="22" id="IAL-i7-0WG"/>
<constraint firstItem="Ljf-ew-dFy" firstAttribute="leading" secondItem="IPo-Hz-FA1" secondAttribute="trailing" constant="8" id="J8E-t8-gI1"/>
<constraint firstAttribute="trailing" secondItem="201-Tu-53I" secondAttribute="trailing" constant="16" id="JVC-Ka-pOt"/>
<constraint firstItem="jvS-nx-JhV" firstAttribute="leading" secondItem="0gS-xR-4Le" secondAttribute="leading" constant="5" id="P00-iS-abC"/>
<constraint firstItem="IPo-Hz-FA1" firstAttribute="leading" secondItem="jvS-nx-JhV" secondAttribute="trailing" constant="10" id="SFT-OI-f7s"/>
<constraint firstItem="0m7-AT-Eya" firstAttribute="leading" secondItem="Kpb-Mz-fbz" secondAttribute="trailing" constant="22" id="SKZ-SB-gUV"/>
<constraint firstItem="JeZ-sa-j9F" firstAttribute="leading" secondItem="Ljf-ew-dFy" secondAttribute="trailing" constant="11" id="Su2-k9-ZuQ"/>
<constraint firstItem="201-Tu-53I" firstAttribute="leading" secondItem="JeZ-sa-j9F" secondAttribute="trailing" constant="10" id="Zzh-F4-3Lv"/>
<constraint firstItem="e66-L1-kbk" firstAttribute="leading" secondItem="IPo-Hz-FA1" secondAttribute="trailing" constant="13" id="bQs-ue-I0H"/>
<constraint firstAttribute="trailing" secondItem="0m7-AT-Eya" secondAttribute="trailing" constant="20" id="uLi-PC-rC9"/>
</constraints>
<connections>
<outlet property="imageView" destination="DMw-xR-BeB" id="m01-aR-tqa"/>
<outlet property="textField" destination="oWx-jq-02H" id="hC6-7m-qaL"/>
<outlet property="imageView" destination="jvS-nx-JhV" id="ljW-Xx-zEb"/>
<outlet property="textField" destination="ni5-tf-iVs" id="hW6-Bx-eDh"/>
</connections>
</tableCellView>
</prototypeCellViews>
@@ -199,7 +206,13 @@
</scroller>
</scrollView>
</subviews>
<point key="canvasLocation" x="638" y="-658"/>
<constraints>
<constraint firstItem="mTr-W0-MgJ" firstAttribute="top" secondItem="T1P-b9-TzF" secondAttribute="top" id="IdY-Zi-46Q"/>
<constraint firstAttribute="bottom" secondItem="mTr-W0-MgJ" secondAttribute="bottom" id="LzW-JW-ri7"/>
<constraint firstItem="mTr-W0-MgJ" firstAttribute="leading" secondItem="T1P-b9-TzF" secondAttribute="leading" id="fNN-1q-dGx"/>
<constraint firstAttribute="trailing" secondItem="mTr-W0-MgJ" secondAttribute="trailing" id="kSR-15-y0m"/>
</constraints>
<point key="canvasLocation" x="653" y="-658"/>
</view>
</objects>
<resources>
+5
View File
@@ -112,9 +112,13 @@ NSDictionary* extractSigningInfo(NSString* path)
//init signing status
signingStatus = [NSMutableDictionary dictionary];
//signingStatus[KEY_SIGNATURE_STATUS] = @0;
//return signingStatus;
//create static code
status = SecStaticCodeCreateWithPath((__bridge CFURLRef)([NSURL fileURLWithPath:path]), kSecCSDefaultFlags, &staticCode);
//TODO: called same before!?
//save signature status
signingStatus[KEY_SIGNATURE_STATUS] = [NSNumber numberWithInt:status];
@@ -131,6 +135,7 @@ NSDictionary* extractSigningInfo(NSString* path)
//check signature
status = SecStaticCodeCheckValidityWithErrors(staticCode, kSecCSDoNotValidateResources, NULL, NULL);
//TODO: called same above?
//(re)save signature status
signingStatus[KEY_SIGNATURE_STATUS] = [NSNumber numberWithInt:status];
+12 -2
View File
@@ -262,7 +262,8 @@
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//make request to VT
result = [vtObj reScan:self.fileObj];
//TODO: re-enable
//result = [vtObj reScan:self.fileObj];
//got result
// ->update UI and launch browswer to show report
@@ -296,11 +297,16 @@
// ->will update VT button in UI once results are retrieved
if(nil != scanID)
{
////TODO: re-enable
/*
//kick off task to re-query VT
// ->wait 60 seconds though to give VT servers some time to process
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 60 * NSEC_PER_SEC), dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[vtObj getInfoForItem:self.fileObj scanID:scanID rowIndex:self.rowIndex];
});
*/
}
//ask app delegate to update item in table
@@ -368,7 +374,8 @@
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//submit file to VT
result = [vtObj submit:self.fileObj];
//TODO: re-enable
//result = [vtObj submit:self.fileObj];
// ->need this for (re)queries
scanID = result[VT_RESULTS_SCANID];
@@ -380,10 +387,13 @@
// ->will update VT button in UI once results are retrieved
if(nil != scanID)
{
//TODO: re-enable
/*
//kick off task to re-query VT
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 60 * NSEC_PER_SEC), dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[vtObj getInfoForItem:self.fileObj scanID:scanID rowIndex:self.rowIndex];
});
*/
}
//got response
+15 -4
View File
@@ -6,6 +6,7 @@
// Copyright (c) 2015 Objective-See. All rights reserved.
//
#import "Binary.h"
#import <Foundation/Foundation.h>
@interface VirusTotal : NSObject
@@ -13,8 +14,18 @@
}
/* PROPERTIES */
//array for (up to 25) items
@property (nonatomic, retain)NSMutableArray* items;
/* METHODS */
//add item
// ->will query VT when 25 items are hit
-(void)addItem:(Binary*)binary;
//thread function
// ->runs in the background to get virus total info about a plugin's items
//-(void)getInfo:(PluginBase*)plugin;
@@ -23,17 +34,17 @@
-(NSDictionary*)postRequest:(NSURL*)url parameters:(id)params;
//submit a file to VT
-(NSDictionary*)submit:(File*)fileObj;
//-(NSDictionary*)submit:(File*)fileObj;
//submit a rescan request
-(NSDictionary*)reScan:(File*)fileObj;
//-(NSDictionary*)reScan:(File*)fileObj;
//process results
// ->updates items (found, detection ratio, etc)
-(void)processResults:(NSArray*)items results:(NSDictionary*)results;
-(void)processResults:(NSMutableDictionary*)queriedItems results:(NSDictionary*)results;
//get info for a single item
// ->will callback into AppDelegate to reload plugin
-(void)getInfoForItem:(File*)fileObj scanID:(NSString*)scanID rowIndex:(NSUInteger)rowIndex;
//-(void)getInfoForItem:(File*)fileObj scanID:(NSString*)scanID rowIndex:(NSUInteger)rowIndex;
@end
+167 -32
View File
@@ -14,6 +14,118 @@
@implementation VirusTotal
@synthesize items;
//init
-(id)init
{
//init super
self = [super init];
if(nil != self)
{
//alloc array for items
items = [NSMutableArray array];
}
return self;
}
//add item
// ->will query VT when 25 items are hit
-(void)addItem:(Binary*)binary
{
//sync
@synchronized(self.items)
{
//add item
[self.items addObject:binary];
}
//query VT once 25 items have been gathered
if(VT_MAX_QUERY_COUNT == self.items.count)
{
//process
[self queryVT];
}
}
//make query to VT
-(void)queryVT
{
//VT query URL
NSURL* queryURL = nil;
//item data
NSMutableDictionary* itemData = nil;
//array of queried items
// ->needed so can save VT results back into binaries
NSMutableDictionary* queriedItems = nil;
//parameters
NSMutableArray* parameters = nil;
//results
NSDictionary* results = nil;
//init query URL
queryURL = [NSURL URLWithString:[NSString stringWithFormat:@"%@%@", VT_QUERY_URL, VT_API_KEY]];
//alloc list for items
parameters = [NSMutableArray array];
//alloc dictionary for queried items
queriedItems = [NSMutableDictionary dictionary];
//sync
@synchronized(self.items)
{
//add all binaries to VT query
for(Binary* item in self.items)
{
//alloc item data
itemData = [NSMutableDictionary dictionary];
//auto start location
itemData[@"autostart_location"] = @"n/a";
//set item name
itemData[@"autostart_entry"] = item.name;
//set item path
itemData[@"image_path"] = item.path;
//set hash
itemData[@"hash"] = item.hashes[KEY_HASH_SHA1];
//set creation times
itemData[@"creation_datetime"] = [item.attributes.fileCreationDate description];
//add item to parameters
[parameters addObject:itemData];
//save as queried item
queriedItems[item.hashes[KEY_HASH_SHA1]] = item;
}
//remove all items
// ->since they've been added to VT request
[self.items removeAllObjects];
}//sync
//make query to VT
results = [self postRequest:queryURL parameters:parameters];
if(nil != results)
{
//process results
[self processResults:queriedItems results:results];
}
return;
}
/*
//thread function
// ->runs in the background to get virus total info about a plugin's items
@@ -494,45 +606,68 @@ bail:
}
//process results
// ->save VT info into each File obj and all flagged files
-(void)processResults:(NSArray*)items results:(NSDictionary*)results
// ->save VT info into
-(void)processResults:(NSMutableDictionary*)queriedItems results:(NSDictionary*)results
{
//queried binary obj
Binary* queriedItem = nil;
//flag for top pane reload
// ->will be set if any of the queried binaries are a task executable
BOOL reloadTopPane = NO;
//flag for bottom pane reload
// ->will be set if any of the queried binaries are a dylib
BOOL reloadBottomPane = NO;
//process all results
// ->save VT result dictionary into File obj
for(NSDictionary* result in results[VT_RESULTS])
{
//sync
// ->since array will be reset if user clicks 'stop' scan
@synchronized(items)
//extract ('match') queried item
// ->VT gives us back a hash
queriedItem = queriedItems[result[@"hash"]];
//sanity check
if(nil == queriedItem)
{
//find all items that match
// ->might be dupes, which is fine
for(Binary* item in items)
{
//for matches, save vt info
if(YES == [result[@"hash"] isEqualToString:item.hashes[KEY_HASH_SHA1]])
{
//save
item.vtInfo = result;
//if its flagged save in File's plugin
if(0 != [result[VT_RESULTS_POSITIVES] unsignedIntegerValue])
{
/*
//sync
// ->since array will be reset if user clicks 'stop' scan
@synchronized(item.plugin.flaggedItems)
{
//save
[item.plugin.flaggedItems addObject:item];
}
*/
}
}
//skip
continue;
}
}//sync
//save VT results into item
queriedItem.vtInfo = result;
//for task executables
// ->set flag to reload top
if(YES == queriedItem.isTaskBinary)
{
//set
reloadTopPane = YES;
}
//for dylibs
// ->set flag to reload bottom
else
{
reloadBottomPane = YES;
}
//TODO: do something with detections!?
//if(0 != [result[VT_RESULTS_POSITIVES] unsignedIntegerValue])
}
//reload top pane
if(YES == reloadTopPane)
{
//reload
[((AppDelegate*)[[NSApplication sharedApplication] delegate]) reloadTaskTable];
}
//reload bottom pane
if(YES == reloadBottomPane)
{
//reload
[((AppDelegate*)[[NSApplication sharedApplication] delegate]) reloadBottomPane:nil itemView:DYLIBS_VIEW];
}
return;