Properly filter error messages which have changed,

escape options passed through command line,
run database reload in separate thread,
and make connecting to the database even more automagical.



git-svn-id: file:///home/svn/framework3/trunk@13168 4d416f70-5f16-0410-b530-b9f4589650da
This commit is contained in:
Matt Weeks 2011-07-14 02:39:16 +00:00
parent 338a13baac
commit fdf6660a55
7 changed files with 54 additions and 25 deletions

Binary file not shown.

View File

@ -22,9 +22,23 @@ public class DbConnectDialog extends OptionsDialog {
//Opens dialog to get options
public static boolean connect(Frame parent, RpcConnection rpcConn){
DbConnectDialog cd = new DbConnectDialog(parent, rpcConn, true);
try{
if(cd.tryConnect())
return true;
} catch (MsfException mex) { // on error connecting, show dialog
}
cd.setVisible(true);
return cd.success;
}
//Tries to connect without opening a dialog
public static boolean tryConnect(Frame parent, RpcConnection rpcConn){
DbConnectDialog cd = new DbConnectDialog(parent, rpcConn, true);
try{
return cd.tryConnect();
} catch (MsfException mex) { // on error connecting, show dialog
}
return false;
}
/** Creates new form DbConnectDialog */
public DbConnectDialog(Frame parent, RpcConnection rpcConn, boolean modal) {
super(parent, "Database Connection Options", modal);
@ -240,23 +254,27 @@ public class DbConnectDialog extends OptionsDialog {
}
private void connectButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_connectButtonActionPerformed
try {
success = tryConnect();
if (!success)
MsfguiApp.showMessage(myParent, "Failure connecting to database!");
} catch (MsfException mex) {
MsfguiApp.showMessage(myParent, mex);
}
setVisible(false);
}
/** Tries to connect to the database with given credentials */
private boolean tryConnect() throws MsfException{
HashMap opts = new HashMap();
addNonempty("host",hostField, opts);
addNonempty("host", hostField, opts);
addNonempty("port", portField, opts);
addNonempty("username", usernameField, opts);
addNonempty("password", passwordField, opts);
addNonempty("database", dbNameField, opts);
opts.put("driver", typeSpinner.getValue().toString());
props.put("dbdriver", typeSpinner.getValue().toString());
try{
Map res = (Map)rpcConn.execute("db.connect",opts);
success = "success".equals(res.get("result"));
if(!success)
MsfguiApp.showMessage(myParent, res);
}catch(MsfException mex){
MsfguiApp.showMessage(myParent, mex);
}
setVisible(false);
Map res = (Map) rpcConn.execute("db.connect",opts);
return "success".equals(res.get("result"));
}//GEN-LAST:event_connectButtonActionPerformed
private void cancelButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cancelButtonActionPerformed

View File

@ -153,7 +153,7 @@ public class InteractWindow extends MsfFrame implements ClipboardOwner {
}
publish(received);
} catch (MsfException ex) {
if(!ex.getMessage().equals("unknown session"))
if(!ex.getMessage().contains("unknown session"))
MsfguiApp.showMessage(null, ex);
if(!ex.getMessage().contains("timed out")) // on timeout, just retry
timerCommand.setCharAt(0, STOP_POLLING);

View File

@ -192,6 +192,8 @@ public class MainFrame extends FrameView {
Thread.sleep(delay);
//update sessions
Map slist = (Map) rpcConn.execute("session.list");
if(statusMessageLabel.getText().contains("timed out"))
publish(""); // If last attempt was a timeout, reset since we're rollin again
ArrayList sessionList = new ArrayList();
for (Object sid : slist.keySet()) {
Map session = (Map) slist.get(sid);
@ -230,9 +232,11 @@ public class MainFrame extends FrameView {
publish((Object)jobStrings);
} catch (MsfException msfEx) {
msfEx.printStackTrace();
publish("Error getting session list"+msfEx);
publish("Error getting session list "+msfEx);
if(!msfEx.getMessage().contains("timed out")) // on timeout, just retry
return new ArrayList();
else
publish("Timeout getting session list. Retrying...");
} catch (InterruptedException iex){
}
}
@ -412,21 +416,23 @@ nameloop: for (int i = 0; i < names.length; i++) {
meterpreterPopupMenu.add(postModMenu,4);
expandList((List) ((Map)rpcConn.execute("module.post")).get("modules"), postModMenu, moduleFactory, "post");
setProgress(0.85f);
setMessage("Querying database...");
// Enable menus
postMenu.setEnabled(true);
databaseMenu.setEnabled(true);
pluginsMenu.setEnabled(true);
consoleMenu.setEnabled(true);
reloadDb();
setProgress(0.95f);
setMessage("Finding open consoles");
refreshConsoles();
consoleMenu.setEnabled(true);
setMessage("Querying database...");
//First try to connect to the database
DbConnectDialog.tryConnect(getFrame(), rpcConn);
reloadDb();
if(MainFrame.this.closeConsoleMenu.getItemCount() == 0 && !tabbedPane.isEnabledAt(3)){
registerConsole( (Map)rpcConn.execute("console.create"), false, "");
reloadDb();
}
setProgress(0.95f);
databaseMenu.setEnabled(true);
pluginsMenu.setEnabled(true);
setProgress(1.0f);
} catch (MsfException ex) {
statusAnimationLabel.setText("Error getting module lists. " + ex);
@ -1262,7 +1268,12 @@ nameloop: for (int i = 0; i < names.length; i++) {
private void connectItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_connectItemActionPerformed
if(DbConnectDialog.connect(getFrame(), rpcConn))
reloadDb();
new SwingWorker(){
protected Object doInBackground() throws Exception {
reloadDb();
return null;
}
}.execute();
}//GEN-LAST:event_connectItemActionPerformed
/** Refreshes the database tables. */
@ -1608,7 +1619,7 @@ nameloop: for (int i = 0; i < names.length; i++) {
}
});
jobsList.addMouseListener( new PopupMouseListener() {
public void mouseClicked(MouseEvent e){
public void mouseReleased(MouseEvent e){
int indx = jobsList.locationToIndex(e.getPoint());
if (indx == -1)
return;

View File

@ -262,7 +262,7 @@ public class MeterpFileBrowser extends MsfFrame {
}
} catch (Exception ex) {
ex.printStackTrace();
if(ex.getMessage().equals("unknown session"))
if(ex.getMessage().contains("unknown session"))
readTimer.stop();
MsfguiApp.showMessage(null, ex);
}

View File

@ -269,7 +269,7 @@ public abstract class ModuleInfoWindow extends MsfFrame {
for (Object entObj : hash.entrySet()) {
Map.Entry ent = (Map.Entry) entObj;
if (!(ent.getKey().toString().equals("TARGET")) && !(ent.getKey().toString().equals("PAYLOAD")))
autoCommands.add("set " + ent.getKey() + " " + ent.getValue());
autoCommands.add("set " + ent.getKey() + " " + MsfguiApp.escapeBackslashes(ent.getValue().toString()));
}
autoCommands.add("exploit");
InteractWindow iw = new InteractWindow(rpcConn, res, autoCommands);

View File

@ -105,7 +105,7 @@ public class ProcessList extends MsfFrame {
} catch(NullPointerException nex){ //junk data from previous command? Ignore.
} catch (Exception ex) {
ex.printStackTrace();
if (ex.getMessage().equals("unknown session"))
if (ex.getMessage().contains("unknown session"))
readTimer.stop();
MsfguiApp.showMessage(null, ex.getMessage());
}
@ -120,7 +120,7 @@ public class ProcessList extends MsfFrame {
rpcConn.execute("session.meterpreter_run_single", session.get("id"),cmd);
} catch (Exception ex) {
MsfguiApp.showMessage(this, ex);
if (ex.getMessage().equals("unknown session"))
if (ex.getMessage().contains("unknown session"))
return true;
}
return false;