From c06609566b943ded212007fa7602bc91075f820c Mon Sep 17 00:00:00 2001 From: tux_mind Date: Sat, 29 Aug 2015 15:58:43 +0200 Subject: [PATCH 1/9] use singleton pattern with lazy loading for toolbox --- cSploit/src/org/csploit/android/core/System.java | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/cSploit/src/org/csploit/android/core/System.java b/cSploit/src/org/csploit/android/core/System.java index 47c7cac107..43936ccbee 100644 --- a/cSploit/src/org/csploit/android/core/System.java +++ b/cSploit/src/org/csploit/android/core/System.java @@ -121,7 +121,7 @@ public class System private static ArrayList mPlugins = null; private static Plugin mCurrentPlugin = null; // toolbox singleton - private static ToolBox mTools = new ToolBox(); + private static ToolBox mTools = null; private static HTTPSRedirector mRedirector = null; private static Proxy mProxy = null; @@ -212,9 +212,7 @@ public static void init(Context context) throws Exception{ } public static void reloadTools() { - if(mTools == null) - mTools = new ToolBox(); - mTools.reload(); + getTools().reload(); } public static class SuException extends Exception { @@ -833,7 +831,11 @@ public static void loadSession(String filename) throws Exception{ } public static ToolBox getTools() { - return mTools; + synchronized (System.class) { + if(mTools == null) + mTools = new ToolBox(); + return mTools; + } } public static RPCClient getMsfRpc() { @@ -1190,7 +1192,7 @@ public static void setForwarding(boolean enabled){ cmd = "echo " + status + " > " + IPV4_FORWARD_FILEPATH; try{ - mTools.shell.run(cmd); + getTools().shell.run(cmd); } catch(Exception e){ Logger.error(e.getMessage()); From d06a4ac3fcdf4a90013883804a1cedb3d143ada8 Mon Sep 17 00:00:00 2001 From: tux_mind Date: Sat, 29 Aug 2015 16:10:10 +0200 Subject: [PATCH 2/9] start network radar only if WiFi is connected --- cSploit/src/org/csploit/android/MainActivity.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/cSploit/src/org/csploit/android/MainActivity.java b/cSploit/src/org/csploit/android/MainActivity.java index bc1f7d2cc1..c2d6a928f7 100644 --- a/cSploit/src/org/csploit/android/MainActivity.java +++ b/cSploit/src/org/csploit/android/MainActivity.java @@ -247,8 +247,9 @@ private void onCoreUpdated() { MainActivity.this.runOnUiThread(new Runnable() { @Override public void run() { - System.reloadNetworkMapping(); - createLayout(); + System.reloadNetworkMapping(); + createLayout(); + if(System.isInitialized()) startNetworkRadar(true); } }); From aaad501b2920217871df0a8200232d299e110e50 Mon Sep 17 00:00:00 2001 From: tux_mind Date: Sat, 29 Aug 2015 22:04:30 +0200 Subject: [PATCH 3/9] apply a filter to select only cSploit releases from MSF repo --- .../org/csploit/android/net/GitHubParser.java | 38 +++++++++++++++---- 1 file changed, 30 insertions(+), 8 deletions(-) diff --git a/cSploit/src/org/csploit/android/net/GitHubParser.java b/cSploit/src/org/csploit/android/net/GitHubParser.java index dbc60311cf..2af843bdd2 100644 --- a/cSploit/src/org/csploit/android/net/GitHubParser.java +++ b/cSploit/src/org/csploit/android/net/GitHubParser.java @@ -20,7 +20,8 @@ package org.csploit.android.net; -import org.csploit.android.core.Logger; +import org.csploit.android.core.*; +import org.csploit.android.core.System; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; @@ -46,12 +47,23 @@ public class GitHubParser { private JSONObject mLastCommit = null; private JSONObject mLastRelease = null; + private String mTagFilter = null; + private static GitHubParser msfRepo = new GitHubParser("cSploit", "android.MSF"); private static GitHubParser cSploitRepo = new GitHubParser("cSploit", "android"); private static GitHubParser coreRepo = new GitHubParser("cSploit", "android.native"); private static GitHubParser rubyRepo = new GitHubParser("cSploit", "android.native.ruby"); public static GitHubParser getMsfRepo() { + String customUsername = System.getSettings().getString("MSF_GITHUB_USERNAME", "cSploit"); + String customProject = System.getSettings().getString("MSF_GITHUB_PROJECT", "android.MSF"); + + if(!customUsername.equals(msfRepo.username) || !customProject.equals(msfRepo.project)) { + msfRepo = new GitHubParser(customUsername, customProject); + } + + msfRepo.mTagFilter = "csploit"; + return msfRepo; } @@ -89,13 +101,21 @@ private void fetchReleases() throws IOException, JSONException { for(int i=0;i Date: Sun, 30 Aug 2015 08:46:00 +0200 Subject: [PATCH 4/9] drop support for native gem updates --- .../src/org/csploit/android/MainActivity.java | 7 - .../csploit/android/core/ArchiveMetadata.java | 3 - .../csploit/android/core/UpdateChecker.java | 5 - .../csploit/android/core/UpdateService.java | 229 +++--------------- .../org/csploit/android/net/GemParser.java | 138 ----------- 5 files changed, 34 insertions(+), 348 deletions(-) delete mode 100644 cSploit/src/org/csploit/android/net/GemParser.java diff --git a/cSploit/src/org/csploit/android/MainActivity.java b/cSploit/src/org/csploit/android/MainActivity.java index c2d6a928f7..17b78b77cf 100644 --- a/cSploit/src/org/csploit/android/MainActivity.java +++ b/cSploit/src/org/csploit/android/MainActivity.java @@ -1232,7 +1232,6 @@ private void onUpdateDone(UpdateService.action target) { switch (target) { case ruby_update: case msf_update: - case gems_update: StartRPCServer(); break; case core_update: @@ -1299,12 +1298,6 @@ public void onReceive(Context context, Intent intent) { getString(R.string.new_update_desc2); onUpdateAvailable(description, UpdateService.action.msf_update); - } else if (intent.getAction().equals(GEMS_AVAILABLE)) { - - final String description = getString(R.string.new_gems_update_desc) + " " + - getString(R.string.new_update_desc2); - - onUpdateAvailable(description, UpdateService.action.gems_update); } else if (intent.getAction().equals(UPDATE_AVAILABLE)) { final String remoteVersion = (String) intent.getExtras().get( AVAILABLE_VERSION); diff --git a/cSploit/src/org/csploit/android/core/ArchiveMetadata.java b/cSploit/src/org/csploit/android/core/ArchiveMetadata.java index a9a9e0fe95..7425bd2dea 100644 --- a/cSploit/src/org/csploit/android/core/ArchiveMetadata.java +++ b/cSploit/src/org/csploit/android/core/ArchiveMetadata.java @@ -33,8 +33,6 @@ public class ArchiveMetadata { skipRoot, fixShebang, errorOccurred; - public HashMap> - patches; public ArchiveMetadata() { reset(); @@ -49,7 +47,6 @@ public void reset() { archiver = null; contentIntent = null; fixShebang = errorOccurred = skipRoot = false; - patches = null; } } diff --git a/cSploit/src/org/csploit/android/core/UpdateChecker.java b/cSploit/src/org/csploit/android/core/UpdateChecker.java index b70d6693cc..30f8a1c43a 100644 --- a/cSploit/src/org/csploit/android/core/UpdateChecker.java +++ b/cSploit/src/org/csploit/android/core/UpdateChecker.java @@ -70,9 +70,6 @@ public void run(){ boolean checkRuby = canCheckMsf && prefs.getBoolean("PREF_UPDATES_RUBY", true); - boolean checkGems = canCheckMsf && prefs.getBoolean("PREF_UPDATES_GEMS", true) && - System.getLocalRubyVersion() != null; - boolean checkMsf = canCheckMsf && prefs.getBoolean("PREF_UPDATES_MSF", true) && System.getLocalRubyVersion() != null; @@ -84,8 +81,6 @@ else if(checkRuby && UpdateService.isRubyUpdateAvailable()) send(RUBY_AVAILABLE); else if(checkMsf && UpdateService.isMsfUpdateAvailable()) { send(MSF_AVAILABLE); - } else if(checkGems && UpdateService.isGemUpdateAvailable()){ - send(GEMS_AVAILABLE); } else send(UPDATE_NOT_AVAILABLE); diff --git a/cSploit/src/org/csploit/android/core/UpdateService.java b/cSploit/src/org/csploit/android/core/UpdateService.java index 0e286ff42f..81d2d717d7 100644 --- a/cSploit/src/org/csploit/android/core/UpdateService.java +++ b/cSploit/src/org/csploit/android/core/UpdateService.java @@ -29,7 +29,6 @@ import android.support.v4.app.NotificationCompat; import com.github.zafarkhaja.semver.Version; -import com.sksamuel.diffpatch.DiffMatchPatch; import org.apache.commons.compress.archivers.ArchiveEntry; import org.apache.commons.compress.archivers.ArchiveInputStream; @@ -44,12 +43,8 @@ import org.csploit.android.R; import org.csploit.android.core.ArchiveMetadata.archiveAlgorithm; import org.csploit.android.core.ArchiveMetadata.compressionAlgorithm; -import org.csploit.android.net.GemParser; import org.csploit.android.net.GitHubParser; -import org.csploit.android.net.RemoteReader; import org.csploit.android.tools.Raw; -import org.json.JSONException; -import org.json.JSONObject; import java.io.BufferedInputStream; import java.io.ByteArrayOutputStream; @@ -67,17 +62,10 @@ import java.security.NoSuchAlgorithmException; import java.util.ArrayList; import java.util.Arrays; -import java.util.HashMap; -import java.util.Iterator; -import java.util.LinkedList; import java.util.concurrent.CancellationException; public class UpdateService extends IntentService { - // Resources defines - private static final String REMOTE_GEMS_VERSION_URL = "http://gems.dsploit.net/atom.xml"; - private static final String REMOTE_GEM_SERVER = "http://gems.dsploit.net/"; - // Intent defines public static final String START = "UpdateService.action.START"; public static final String ERROR = "UpdateService.action.ERROR"; @@ -96,7 +84,6 @@ public class UpdateService extends IntentService private static final ArchiveMetadata mMsfInfo = new ArchiveMetadata(); private static final ArchiveMetadata mRubyInfo = new ArchiveMetadata(); private static final ArchiveMetadata mCoreInfo = new ArchiveMetadata(); - private static final GemParser mGemUploadParser = new GemParser(REMOTE_GEMS_VERSION_URL); private boolean mRunning = false; @@ -115,7 +102,6 @@ public enum action { apk_update, core_update, ruby_update, - gems_update, msf_update } @@ -355,58 +341,6 @@ public static boolean isRubyUpdateAvailable() { return false; } - public static boolean isGemUpdateAvailable() { - - try { - synchronized (mGemUploadParser) { - GemParser.RemoteGemInfo[] gemInfoArray = mGemUploadParser.parse(); - ArrayList gemsToUpdate = new ArrayList(); - - if (gemInfoArray.length == 0) - return false; - - String format = String.format("%s/lib/ruby/gems/1.9.1/specifications/%%s-%%s-arm-linux.gemspec", System.getRubyPath()); - - for (GemParser.RemoteGemInfo gemInfo : gemInfoArray) { - File f = new File(String.format(format, gemInfo.name, gemInfo.version)); - if (!f.exists() || f.lastModified() < gemInfo.uploaded.getTime()) { - Logger.debug(String.format("'%s' %s", f.getAbsolutePath(), (f.exists() ? "is old" : "does not exists"))); - gemsToUpdate.add(gemInfo); - } - } - - if(gemsToUpdate.size() == 0) - return false; - - mGemUploadParser.setOldGems(gemsToUpdate.toArray(new GemParser.RemoteGemInfo[gemsToUpdate.size()])); - return true; - } - } catch (IOException e) { - Logger.warning(e.getClass() + ": " + e.getMessage()); - } catch (Exception e) { - System.errorLogging(e); - } - return false; - } - - private static void parseMsfManifest(String manifestUrl) throws IOException, JSONException { - JSONObject manifest, files; - - manifest = new JSONObject(new String(RemoteReader.fetch(manifestUrl))); - files = manifest.getJSONObject("files"); - - mMsfInfo.url = manifest.getString("url"); - mMsfInfo.patches = new HashMap>(); - - Iterator it = files.keys(); - DiffMatchPatch dmp = new DiffMatchPatch(); - - while(it.hasNext()) { - String key = (String) it.next(); - mMsfInfo.patches.put(key, (LinkedList) dmp.patch_fromText(files.getString(key))); - } - } - /** * is a MetaSploitFramework update available? * @return true if the framework can be updated, false otherwise @@ -419,16 +353,10 @@ public static boolean isMsfUpdateAvailable() { try { synchronized (mMsfInfo) { if (mMsfInfo.url == null) { - String customManifestUrl = System.getSettings().getString("MSF_MANIFEST_URL", "NONE"); + mMsfInfo.url = msfRepo.getLastReleaseAssetUrl(); - if(customManifestUrl.equals("NONE")) { - parseMsfManifest(msfRepo.getLastReleaseAssetUrl()); - mMsfInfo.versionString = msfRepo.getLastReleaseVersion(); - mMsfInfo.version = Version.valueOf(mMsfInfo.versionString); - } else { - parseMsfManifest(customManifestUrl); - mMsfInfo.versionString = "FORCE_UPDATE"; - } + mMsfInfo.versionString = msfRepo.getLastReleaseVersion(); + mMsfInfo.version = Version.valueOf(mMsfInfo.versionString); mMsfInfo.name = "msf.zip"; mMsfInfo.path = String.format("%s/%s", System.getStoragePath(), mMsfInfo.name); @@ -438,13 +366,12 @@ public static boolean isMsfUpdateAvailable() { if (local.exists() && local.isFile() && local.canRead()) { mMsfInfo.url = null; - mMsfInfo.versionString = "FORCE_UPDATE"; + mMsfInfo.versionString = "LOCAL_UPDATE"; } mMsfInfo.outputDir = System.getMsfPath(); mMsfInfo.executableOutputDir = ExecChecker.msf().getRoot(); mMsfInfo.archiver = archiveAlgorithm.zip; - mMsfInfo.skipRoot = true; mMsfInfo.fixShebang = true; if (!mSettingReceiver.getFilter().contains("MSF_DIR")) { @@ -1030,7 +957,6 @@ private void extract() throws CancellationException, RuntimeException, IOExcepti boolean isTar, r,w,x, isElf, isScript; short percentage,old_percentage; Child which; - DiffMatchPatch dmp; if(mCurrentTask.path==null||mCurrentTask.outputDir==null) return; @@ -1064,7 +990,6 @@ public void onNewLine(String line) { is = openArchiveStream(counter); isTar = mCurrentTask.archiver.equals(archiveAlgorithm.tar); old_percentage = -1; - dmp = (mCurrentTask.patches != null && mCurrentTask.patches.size() > 0) ? new DiffMatchPatch() : null; f = new File(mCurrentTask.outputDir); if (f.exists() && f.isDirectory() && (list = f.listFiles()) != null && list.length > 2) @@ -1101,77 +1026,49 @@ else if(entry.isDirectory()) byte[] buffer = null; byte[] writeMe = null; - // patch the file - if(dmp != null && mCurrentTask.patches.containsKey(name)) { - buffer = new byte[(int)entry.getSize()]; - IOUtils.readFully(is, buffer); - writeMe = buffer = ((String)dmp.patch_apply(mCurrentTask.patches.get(name), - new String(buffer))[0]).getBytes(); - } - outputStream = new FileOutputStream(f); // check il file is an ELF or a script if((!isTar || mCurrentTask.fixShebang) && entry.getSize() > 4) { - if (buffer == null) { - writeMe = buffer = new byte[4]; + writeMe = buffer = new byte[4]; - IOUtils.readFully(is, buffer); - - if (buffer[0] == 0x7F && buffer[1] == 0x45 && buffer[2] == 0x4C && buffer[3] == 0x46) { - isElf = true; - } else if (buffer[0] == '#' && buffer[1] == '!') { - isScript = true; - - ByteArrayOutputStream firstLine = new ByteArrayOutputStream(); - int newline = -1; - - // assume that '\n' is more far then 4 chars. - firstLine.write(buffer); - buffer = new byte[1024]; - count = 0; - - while (mRunning && (count = is.read(buffer)) >= 0 && - (newline = Arrays.binarySearch(buffer, 0, count, (byte) 0x0A)) < 0) { - firstLine.write(buffer, 0, count); - } - - if (!mRunning) { - throw new CancellationException("cancelled while searching for newline."); - } else if(count < 0) { - newline = count = 0; - } else if(newline < 0) { - newline = count; - } + IOUtils.readFully(is, buffer); - firstLine.write(buffer, 0, newline); - firstLine.close(); + if (buffer[0] == 0x7F && buffer[1] == 0x45 && buffer[2] == 0x4C && buffer[3] == 0x46) { + isElf = true; + } else if (buffer[0] == '#' && buffer[1] == '!') { + isScript = true; - byte[] newFirstLine = new String(firstLine.toByteArray()).replace("/usr/bin/env", envPath).getBytes(); + ByteArrayOutputStream firstLine = new ByteArrayOutputStream(); + int newline = -1; - writeMe = new byte[newFirstLine.length + (count - newline)]; + // assume that '\n' is more far then 4 chars. + firstLine.write(buffer); + buffer = new byte[1024]; + count = 0; - java.lang.System.arraycopy(newFirstLine, 0, writeMe, 0, newFirstLine.length); - java.lang.System.arraycopy(buffer, newline, writeMe, newFirstLine.length, count - newline); + while (mRunning && (count = is.read(buffer)) >= 0 && + (newline = Arrays.binarySearch(buffer, 0, count, (byte) 0x0A)) < 0) { + firstLine.write(buffer, 0, count); } - } else { - if (buffer[0] == 0x7F && buffer[1] == 0x45 && buffer[2] == 0x4C && buffer[3] == 0x46) { - isElf = true; - } else if (buffer[0] == '#' && buffer[1] == '!') { - isScript = true; - int newline = Arrays.binarySearch(buffer, (byte) 0x0A); + if (!mRunning) { + throw new CancellationException("cancelled while searching for newline."); + } else if(count < 0) { + newline = count = 0; + } else if(newline < 0) { + newline = count; + } - if (newline < 0) - newline = buffer.length; + firstLine.write(buffer, 0, newline); + firstLine.close(); - byte[] newFirstLine = new String(buffer, 0, newline).replace("/usr/bin/env", envPath).getBytes(); + byte[] newFirstLine = new String(firstLine.toByteArray()).replace("/usr/bin/env", envPath).getBytes(); - writeMe = new byte[buffer.length + (newFirstLine.length - newline)]; + writeMe = new byte[newFirstLine.length + (count - newline)]; - java.lang.System.arraycopy(newFirstLine, 0, writeMe, 0, newFirstLine.length); - java.lang.System.arraycopy(buffer, newline, writeMe, newFirstLine.length, newFirstLine.length - newline); - } + java.lang.System.arraycopy(newFirstLine, 0, writeMe, 0, newFirstLine.length); + java.lang.System.arraycopy(buffer, newline, writeMe, newFirstLine.length, count - newline); } } @@ -1270,7 +1167,7 @@ private void installGems() throws CancellationException, RuntimeException, IOExc throw new RuntimeException("cannot install bundle"); bundleInstallTask = System.getTools().ruby.async( - String.format("bundle install --verbose --gemfile '%s/Gemfile' --without development test", msfPath), + String.format("bundle install --verbose --local --gemfile '%s/Gemfile' --without development test", msfPath), mErrorReceiver); // install gem required by msf using bundle @@ -1282,59 +1179,6 @@ private void installGems() throws CancellationException, RuntimeException, IOExc } } - private void updateGems() throws IOException, InterruptedException, CancellationException, RuntimeException, KeyException, NoSuchAlgorithmException, ChildManager.ChildNotStartedException { - GemParser.RemoteGemInfo[] gemsToUpdate = mGemUploadParser.getGemsToUpdate(); - - if(gemsToUpdate==null||gemsToUpdate.length==0) - return; - - String localFormat = String.format("%s/%%s",System.getStoragePath()); - String remoteFormat = String.format("%s/gems/%%s", REMOTE_GEM_SERVER); - mCurrentTask.archiver = archiveAlgorithm.tar; - - Child shell; - - for(GemParser.RemoteGemInfo gemInfo : gemsToUpdate) { - - String gemFilename = String.format("%s-%s-arm-linux.gem", gemInfo.name, gemInfo.version); - - mCurrentTask.url = String.format(remoteFormat, gemFilename); - mCurrentTask.path = String.format(localFormat, gemFilename); - if(!haveLocalFile()) - downloadFile(); - - mBuilder.setContentTitle(getString(R.string.installing_gems)) - .setContentText(gemInfo.name) - .setContentInfo("") - .setSmallIcon(android.R.drawable.ic_popup_sync) - .setProgress(100, 0, true); - mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build()); - - shell = System.getTools().ruby.async(String.format( - "gem uninstall --force -x -v '%s' '%s'", - gemInfo.version, gemInfo.name), mErrorReceiver); - - String cancelMessage = String.format("cancelled while deleting '%s-%s'", - gemInfo.name, gemInfo.version); - - if(execShell(shell,cancelMessage)!=0) - throw new RuntimeException(String.format("cannot delete '%s-%s'", gemInfo.name, gemInfo.version)); - - shell = System.getTools().ruby.async( - String.format("gem install -l '%s'", mCurrentTask.path), mErrorReceiver); - - cancelMessage = String.format("cancelled while installing '%s-%s'", - gemInfo.name, gemInfo.version); - - if(execShell(shell,cancelMessage)!=0) - throw new RuntimeException(String.format("cannot install '%s-%s'", gemInfo.name, gemInfo.version)); - - if(!(new File(mCurrentTask.path).delete())) - Logger.warning(String.format("cannot delete downloaded gem '%s'", mCurrentTask.path)); - mCurrentTask.path = null; - } - } - private void clearGemsCache() { if(!System.getSettings().getBoolean("MSF_ENABLED", true)) @@ -1408,9 +1252,6 @@ protected void onHandleIntent(Intent intent) { case msf_update: mCurrentTask = mMsfInfo; break; - case gems_update: - mCurrentTask = new ArchiveMetadata(); - break; } try { @@ -1428,8 +1269,6 @@ protected void onHandleIntent(Intent intent) { if (what_to_do == action.msf_update) installGems(); - else if (what_to_do == action.gems_update) - updateGems(); else if (what_to_do == action.core_update) System.initCore(); @@ -1489,7 +1328,7 @@ else if (what_to_do == action.core_update) Logger.error(e.getMessage()); } finally { if(exitForError) { - if(what_to_do == action.msf_update || what_to_do == action.gems_update) + if(what_to_do == action.msf_update) clearGemsCache(); if(what_to_do != action.core_update) wipe(); diff --git a/cSploit/src/org/csploit/android/net/GemParser.java b/cSploit/src/org/csploit/android/net/GemParser.java deleted file mode 100644 index ae131084af..0000000000 --- a/cSploit/src/org/csploit/android/net/GemParser.java +++ /dev/null @@ -1,138 +0,0 @@ -/* - * This file is part of the dSploit. - * - * Copyleft of Simone Margaritelli aka evilsocket - * Massimo Dragano aka tux_mind - * - * dSploit is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * dSploit 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with dSploit. If not, see . - */ - -package org.csploit.android.net; - -import android.util.Xml; - -import org.xmlpull.v1.XmlPullParser; -import org.xmlpull.v1.XmlPullParserException; - -import java.io.IOException; -import java.io.InputStream; -import java.net.HttpURLConnection; -import java.net.URL; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.LinkedList; - -/** - * This class parses feed (XML/atom) containing modification time of uploaded gems - */ -public class GemParser { - - /** - * class that holds info about remote gem - */ - public static class RemoteGemInfo { - public String name; - public String version; - public Date uploaded; - } - - private final String mUrl; - private RemoteGemInfo[] mGems = null; - private RemoteGemInfo[] mOldGems = null; - - public GemParser (String url) { - mUrl = url; - } - - private void fetch() throws ParseException, XmlPullParserException, IOException { - HttpURLConnection connection = null; - InputStream stream = null; - - try { - HttpURLConnection.setFollowRedirects(true); - connection = (HttpURLConnection) (new URL(mUrl)).openConnection(); - connection.connect(); - int ret = connection.getResponseCode(); - if (ret != 200) - throw new IOException("cannot retrieve remote json: " + ret); - - stream = connection.getInputStream(); - XmlPullParser parser = Xml.newPullParser(); - parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false); - parser.setInput(stream, null); - parser.nextTag(); - parser.require(XmlPullParser.START_TAG, null, "feed"); - - RemoteGemInfo gemInfo = null; - SimpleDateFormat parsingDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); - - LinkedList gems = new LinkedList(); - - while(parser.next() != XmlPullParser.END_DOCUMENT) { - - if(parser.getEventType() == XmlPullParser.END_TAG && parser.getName().equals("feed")) - break; - - if(parser.getEventType() == XmlPullParser.START_TAG && parser.getName().equals("entry")) - gemInfo = new RemoteGemInfo(); - - if(gemInfo != null && gemInfo.name != null && parser.getEventType() == XmlPullParser.END_TAG && parser.getName().equals("entry")) { - gems.add(gemInfo); - gemInfo = null; - } - - if(gemInfo != null && parser.getEventType() == XmlPullParser.START_TAG && parser.getName().equals("title")) - { - String[] titleParts = parser.nextText().split(" *[(\\-)] *"); - gemInfo.name = titleParts[0]; - gemInfo.version = titleParts[titleParts.length-1]; - } - - if(gemInfo != null && parser.getEventType() == XmlPullParser.START_TAG && parser.getName().equals("updated")) { - //convert UTC shortcut to offset. Android doesn't support Format X - String datetime = parser.nextText().replaceFirst("Z$","+00"); - gemInfo.uploaded = parsingDateFormat.parse(datetime); - } - - } - - mGems = gems.toArray(new RemoteGemInfo[gems.size()]); - } finally { - if(stream!=null) - stream.close(); - if(connection!=null) - connection.disconnect(); - } - } - - public RemoteGemInfo[] parse() throws IOException, XmlPullParserException, ParseException { - if(mGems == null) - fetch(); - return mGems; - } - - public void setOldGems(RemoteGemInfo[] oldGems) { - mOldGems = oldGems; - } - - public RemoteGemInfo[] getGemsToUpdate() { - return mOldGems; - } - - public void reset() { - mGems = null; - mOldGems = null; - } -} From 450cf38325a1f039f3eeb2c5808e09a36dc65a58 Mon Sep 17 00:00:00 2001 From: tux_mind Date: Mon, 21 Sep 2015 00:25:51 +0200 Subject: [PATCH 5/9] fix tag filter --- cSploit/src/org/csploit/android/net/GitHubParser.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cSploit/src/org/csploit/android/net/GitHubParser.java b/cSploit/src/org/csploit/android/net/GitHubParser.java index 2af843bdd2..6a4547931b 100644 --- a/cSploit/src/org/csploit/android/net/GitHubParser.java +++ b/cSploit/src/org/csploit/android/net/GitHubParser.java @@ -62,7 +62,7 @@ public static GitHubParser getMsfRepo() { msfRepo = new GitHubParser(customUsername, customProject); } - msfRepo.mTagFilter = "csploit"; + msfRepo.mTagFilter = ".*csploit.*"; return msfRepo; } From c30fc08e051cc2b974e63c84cdf9ef229eda22ff Mon Sep 17 00:00:00 2001 From: tux_mind Date: Mon, 21 Sep 2015 00:39:44 +0200 Subject: [PATCH 6/9] msf is now a tar.xz archive --- cSploit/src/org/csploit/android/core/UpdateService.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cSploit/src/org/csploit/android/core/UpdateService.java b/cSploit/src/org/csploit/android/core/UpdateService.java index 81d2d717d7..c7f6e75735 100644 --- a/cSploit/src/org/csploit/android/core/UpdateService.java +++ b/cSploit/src/org/csploit/android/core/UpdateService.java @@ -60,7 +60,6 @@ import java.security.KeyException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; -import java.util.ArrayList; import java.util.Arrays; import java.util.concurrent.CancellationException; @@ -358,7 +357,7 @@ public static boolean isMsfUpdateAvailable() { mMsfInfo.versionString = msfRepo.getLastReleaseVersion(); mMsfInfo.version = Version.valueOf(mMsfInfo.versionString); - mMsfInfo.name = "msf.zip"; + mMsfInfo.name = "msf.tar.xz"; mMsfInfo.path = String.format("%s/%s", System.getStoragePath(), mMsfInfo.name); } @@ -371,7 +370,8 @@ public static boolean isMsfUpdateAvailable() { mMsfInfo.outputDir = System.getMsfPath(); mMsfInfo.executableOutputDir = ExecChecker.msf().getRoot(); - mMsfInfo.archiver = archiveAlgorithm.zip; + mMsfInfo.archiver = archiveAlgorithm.tar; + mMsfInfo.compression = compressionAlgorithm.xz; mMsfInfo.fixShebang = true; if (!mSettingReceiver.getFilter().contains("MSF_DIR")) { From 594f18cc3d782486563b79b770737881826be5d7 Mon Sep 17 00:00:00 2001 From: tux_mind Date: Mon, 21 Sep 2015 01:20:26 +0200 Subject: [PATCH 7/9] core initialization does not belong to the update task ( closes #247 , merge #248 ) --- .../src/org/csploit/android/MainActivity.java | 50 +++++++++++++------ .../csploit/android/core/UpdateService.java | 7 --- 2 files changed, 36 insertions(+), 21 deletions(-) diff --git a/cSploit/src/org/csploit/android/MainActivity.java b/cSploit/src/org/csploit/android/MainActivity.java index c2d6a928f7..e43d494051 100644 --- a/cSploit/src/org/csploit/android/MainActivity.java +++ b/cSploit/src/org/csploit/android/MainActivity.java @@ -117,6 +117,7 @@ public class MainActivity extends ActionBarActivity implements NetworkRadar.Targ private long mLastBackPressTime = 0; private ActionMode mActionMode = null; private ListView lv; + private boolean isRootMissing = false; private void createUpdateStatusText() { if (mUpdateStatus != null) return; @@ -243,7 +244,37 @@ public void run() { }); } + private boolean startCore() { + isRootMissing = false; + try { + System.initCore(); + + return true; + } catch (System.SuException e) { + onInitializationError(getString(R.string.only_4_root)); + isRootMissing = true; + } catch (System.DaemonException e) { + Logger.error(e.getMessage()); + } + + return false; + } + + private void onCoreBeating() { + if(Client.hadCrashed()) { + Logger.warning("Client has previously crashed, building a crash report."); + CrashReporter.notifyNativeLibraryCrash(); + onInitializationError(getString(R.string.JNI_crash_detected)); + } + } + private void onCoreUpdated() { + if(startCore()) { + onCoreBeating(); + } else if ( isRootMissing ) { + return; + } + MainActivity.this.runOnUiThread(new Runnable() { @Override public void run() { @@ -338,21 +369,12 @@ public void run() { boolean coreBeating = System.isCoreInitialized(); if (coreInstalled && !coreBeating) { - try { - System.initCore(); - coreBeating = true; - - if(Client.hadCrashed()) { - Logger.warning("Client has previously crashed, building a crash report."); - CrashReporter.notifyNativeLibraryCrash(); - onInitializationError(getString(R.string.JNI_crash_detected)); + coreBeating = startCore(); + if(coreBeating) { + onCoreBeating(); + } else if ( isRootMissing ) { + return; } - } catch (System.SuException e) { - onInitializationError(getString(R.string.only_4_root)); - return; - } catch (System.DaemonException e) { - Logger.error(e.getMessage()); - } } if (!connectivityAvailable) { diff --git a/cSploit/src/org/csploit/android/core/UpdateService.java b/cSploit/src/org/csploit/android/core/UpdateService.java index 0e286ff42f..4492fce9d3 100644 --- a/cSploit/src/org/csploit/android/core/UpdateService.java +++ b/cSploit/src/org/csploit/android/core/UpdateService.java @@ -1430,8 +1430,6 @@ protected void onHandleIntent(Intent intent) { installGems(); else if (what_to_do == action.gems_update) updateGems(); - else if (what_to_do == action.core_update) - System.initCore(); deleteTemporaryFiles(); createVersionFile(); @@ -1482,11 +1480,6 @@ else if (what_to_do == action.core_update) } catch (ChildManager.ChildDiedException e) { sendError(what_to_do, R.string.error_occured); System.errorLogging(e); - } catch (System.SuException e) { - sendError(what_to_do, R.string.only_4_root); - } catch (System.DaemonException e) { - sendError(what_to_do, R.string.heart_attack); - Logger.error(e.getMessage()); } finally { if(exitForError) { if(what_to_do == action.msf_update || what_to_do == action.gems_update) From 0f5261ce5e587a57de775a556e4182267a597441 Mon Sep 17 00:00:00 2001 From: tux_mind Date: Mon, 21 Sep 2015 01:28:27 +0200 Subject: [PATCH 8/9] reformat code --- .../src/org/csploit/android/MainActivity.java | 2130 ++++++++--------- 1 file changed, 1065 insertions(+), 1065 deletions(-) diff --git a/cSploit/src/org/csploit/android/MainActivity.java b/cSploit/src/org/csploit/android/MainActivity.java index 2d1a1e1a06..bff241859f 100644 --- a/cSploit/src/org/csploit/android/MainActivity.java +++ b/cSploit/src/org/csploit/android/MainActivity.java @@ -102,1258 +102,1258 @@ @SuppressLint("NewApi") public class MainActivity extends ActionBarActivity implements NetworkRadar.TargetListener { - private String UPDATE_MESSAGE; - private static final int WIFI_CONNECTION_REQUEST = 1012; - private boolean isWifiAvailable = false; - private TargetAdapter mTargetAdapter = null; - private NetworkRadar mNetworkRadar = null; - private Child mMsfRpcd = null; - private RadarReceiver mRadarReceiver = new RadarReceiver(); - private UpdateReceiver mUpdateReceiver = new UpdateReceiver(); - private WipeReceiver mWipeReceiver = new WipeReceiver(); - private Menu mMenu = null; - private TextView mUpdateStatus = null; - private Toast mToast = null; - private long mLastBackPressTime = 0; - private ActionMode mActionMode = null; - private ListView lv; - private boolean isRootMissing = false; - - private void createUpdateStatusText() { - if (mUpdateStatus != null) return; - - RelativeLayout layout = (RelativeLayout) findViewById(R.id.layout); - - mUpdateStatus = new TextView(this); - - LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, - LayoutParams.MATCH_PARENT); - - mUpdateStatus.setGravity(Gravity.CENTER); - mUpdateStatus.setLayoutParams(params); - - layout.addView(mUpdateStatus); - } + private String UPDATE_MESSAGE; + private static final int WIFI_CONNECTION_REQUEST = 1012; + private boolean isWifiAvailable = false; + private TargetAdapter mTargetAdapter = null; + private NetworkRadar mNetworkRadar = null; + private Child mMsfRpcd = null; + private RadarReceiver mRadarReceiver = new RadarReceiver(); + private UpdateReceiver mUpdateReceiver = new UpdateReceiver(); + private WipeReceiver mWipeReceiver = new WipeReceiver(); + private Menu mMenu = null; + private TextView mUpdateStatus = null; + private Toast mToast = null; + private long mLastBackPressTime = 0; + private ActionMode mActionMode = null; + private ListView lv; + private boolean isRootMissing = false; - private void createUpdateLayout() { + private void createUpdateStatusText() { + if (mUpdateStatus != null) return; - lv.setVisibility(View.GONE); - findViewById(R.id.textView).setVisibility(View.GONE); + RelativeLayout layout = (RelativeLayout) findViewById(R.id.layout); - createUpdateStatusText(); + mUpdateStatus = new TextView(this); - mUpdateStatus - .setText(UPDATE_MESSAGE.replace("#STATUS#", "...")); + LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, + LayoutParams.MATCH_PARENT); - mUpdateReceiver.register(MainActivity.this); + mUpdateStatus.setGravity(Gravity.CENTER); + mUpdateStatus.setLayoutParams(params); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) - invalidateOptionsMenu(); - } + layout.addView(mUpdateStatus); + } - private void createOfflineLayout() { + private void createUpdateLayout() { - lv.setVisibility(View.GONE); - findViewById(R.id.textView).setVisibility(View.GONE); + lv.setVisibility(View.GONE); + findViewById(R.id.textView).setVisibility(View.GONE); - createUpdateStatusText(); + createUpdateStatusText(); - mUpdateStatus.setText(getString(R.string.no_connectivity)); + mUpdateStatus + .setText(UPDATE_MESSAGE.replace("#STATUS#", "...")); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) - invalidateOptionsMenu(); - } + mUpdateReceiver.register(MainActivity.this); - public void createOnlineLayout() { - findViewById(R.id.textView).setVisibility(View.VISIBLE); - lv.setVisibility(View.VISIBLE); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) + invalidateOptionsMenu(); + } - if (mUpdateStatus != null) - mUpdateStatus.setVisibility(View.GONE); + private void createOfflineLayout() { - if (mTargetAdapter != null) - return; + lv.setVisibility(View.GONE); + findViewById(R.id.textView).setVisibility(View.GONE); - mTargetAdapter = new TargetAdapter(); + createUpdateStatusText(); - lv.setAdapter(mTargetAdapter); + mUpdateStatus.setText(getString(R.string.no_connectivity)); - lv.setOnItemLongClickListener(new OnItemLongClickListener() { - @Override - public boolean onItemLongClick(AdapterView parent, View view, int position, long id) { - Target t = System.getTarget(position); - if (t.getType() == Target.Type.NETWORK) { - if (mActionMode == null) - targetAliasPrompt(t); - return true; - } - if (mActionMode == null) { - mTargetAdapter.clearSelection(); - mActionMode = startSupportActionMode(mActionModeCallback); - } - mTargetAdapter.toggleSelection(position); - return true; - } - }); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) + invalidateOptionsMenu(); + } - mRadarReceiver.register(MainActivity.this); - mUpdateReceiver.register(MainActivity.this); - mWipeReceiver.register(MainActivity.this); + public void createOnlineLayout() { + findViewById(R.id.textView).setVisibility(View.VISIBLE); + lv.setVisibility(View.VISIBLE); - // if called for the second time after wifi connection - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) - invalidateOptionsMenu(); - } + if (mUpdateStatus != null) + mUpdateStatus.setVisibility(View.GONE); - @Override - protected void onActivityResult(int requestCode, int resultCode, - Intent intent) { - if (requestCode == WIFI_CONNECTION_REQUEST && resultCode == RESULT_OK - && intent.hasExtra(WifiScannerActivity.CONNECTED)) { - System.reloadNetworkMapping(); - try { - onCreate(null); - } catch (IllegalStateException e) { - // already attached. don't reattach. - } - } - } + if (mTargetAdapter != null) + return; - private void createLayout() { - boolean wifiAvailable = Network.isWifiConnected(this); - boolean connectivityAvailable = wifiAvailable || Network.isConnectivityAvailable(this); - boolean coreBeating = System.isCoreInitialized(); + mTargetAdapter = new TargetAdapter(); - if (coreBeating && wifiAvailable) { - createOnlineLayout(); - } else if (connectivityAvailable) { - createUpdateLayout(); - } else { - createOfflineLayout(); + lv.setAdapter(mTargetAdapter); + + lv.setOnItemLongClickListener(new OnItemLongClickListener() { + @Override + public boolean onItemLongClick(AdapterView parent, View view, int position, long id) { + Target t = System.getTarget(position); + if (t.getType() == Target.Type.NETWORK) { + if (mActionMode == null) + targetAliasPrompt(t); + return true; } + if (mActionMode == null) { + mTargetAdapter.clearSelection(); + mActionMode = startSupportActionMode(mActionModeCallback); + } + mTargetAdapter.toggleSelection(position); + return true; + } + }); + + mRadarReceiver.register(MainActivity.this); + mUpdateReceiver.register(MainActivity.this); + mWipeReceiver.register(MainActivity.this); + + // if called for the second time after wifi connection + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) + invalidateOptionsMenu(); + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, + Intent intent) { + if (requestCode == WIFI_CONNECTION_REQUEST && resultCode == RESULT_OK + && intent.hasExtra(WifiScannerActivity.CONNECTED)) { + System.reloadNetworkMapping(); + try { + onCreate(null); + } catch (IllegalStateException e) { + // already attached. don't reattach. + } } - - private void onInitializationError(final String message) { - MainActivity.this.runOnUiThread(new Runnable() { - @Override - public void run() { - new FatalDialog(getString(R.string.initialization_error), - message, message.contains(">"), - MainActivity.this).show(); - } - }); + } + + private void createLayout() { + boolean wifiAvailable = Network.isWifiConnected(this); + boolean connectivityAvailable = wifiAvailable || Network.isConnectivityAvailable(this); + boolean coreBeating = System.isCoreInitialized(); + + if (coreBeating && wifiAvailable) { + createOnlineLayout(); + } else if (connectivityAvailable) { + createUpdateLayout(); + } else { + createOfflineLayout(); + } + } + + private void onInitializationError(final String message) { + MainActivity.this.runOnUiThread(new Runnable() { + @Override + public void run() { + new FatalDialog(getString(R.string.initialization_error), + message, message.contains(">"), + MainActivity.this).show(); + } + }); + } + + private boolean startCore() { + isRootMissing = false; + try { + System.initCore(); + + return true; + } catch (System.SuException e) { + onInitializationError(getString(R.string.only_4_root)); + isRootMissing = true; + } catch (System.DaemonException e) { + Logger.error(e.getMessage()); } - private boolean startCore() { - isRootMissing = false; - try { - System.initCore(); - - return true; - } catch (System.SuException e) { - onInitializationError(getString(R.string.only_4_root)); - isRootMissing = true; - } catch (System.DaemonException e) { - Logger.error(e.getMessage()); - } + return false; + } - return false; + private void onCoreBeating() { + if (Client.hadCrashed()) { + Logger.warning("Client has previously crashed, building a crash report."); + CrashReporter.notifyNativeLibraryCrash(); + onInitializationError(getString(R.string.JNI_crash_detected)); } + } - private void onCoreBeating() { - if(Client.hadCrashed()) { - Logger.warning("Client has previously crashed, building a crash report."); - CrashReporter.notifyNativeLibraryCrash(); - onInitializationError(getString(R.string.JNI_crash_detected)); - } + private void onCoreUpdated() { + if (startCore()) { + onCoreBeating(); + } else if (isRootMissing) { + return; } - private void onCoreUpdated() { - if(startCore()) { - onCoreBeating(); - } else if ( isRootMissing ) { - return; + MainActivity.this.runOnUiThread(new Runnable() { + @Override + public void run() { + System.reloadNetworkMapping(); + createLayout(); + if (System.isInitialized()) + startNetworkRadar(true); + } + }); + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + SharedPreferences themePrefs = getSharedPreferences("THEME", 0); + Boolean isDark = themePrefs.getBoolean("isDark", false); + boolean connectivityAvailable; + + if (isDark) + setTheme(R.style.DarkTheme); + else + setTheme(R.style.AppTheme); + + setContentView(R.layout.target_layout); + + lv = (ListView) findViewById(R.id.android_list); + lv.setOnItemClickListener(new ListView.OnItemClickListener() { + + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + + if (mActionMode != null) { + ((TargetAdapter) lv.getAdapter()).toggleSelection(position); + return; } - MainActivity.this.runOnUiThread(new Runnable() { - @Override - public void run() { - System.reloadNetworkMapping(); - createLayout(); - if(System.isInitialized()) - startNetworkRadar(true); - } - }); - } - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - SharedPreferences themePrefs = getSharedPreferences("THEME", 0); - Boolean isDark = themePrefs.getBoolean("isDark", false); - boolean connectivityAvailable; - - if (isDark) - setTheme(R.style.DarkTheme); - else - setTheme(R.style.AppTheme); - - setContentView(R.layout.target_layout); - - lv = (ListView) findViewById(R.id.android_list); - lv.setOnItemClickListener(new ListView.OnItemClickListener() { + new Thread(new Runnable() { + @Override + public void run() { - @Override - public void onItemClick(AdapterView parent, View view, int position, long id) { + startActivityForResult(new Intent(MainActivity.this, + ActionActivity.class), WIFI_CONNECTION_REQUEST); - if (mActionMode != null) { - ((TargetAdapter) lv.getAdapter()).toggleSelection(position); - return; - } + overridePendingTransition(R.anim.slide_in_left, + R.anim.slide_out_left); + } + }).start(); - new Thread(new Runnable() { - @Override - public void run() { + System.setCurrentTarget(position); + Toast.makeText(MainActivity.this, + getString(R.string.selected_) + System.getCurrentTarget(), + Toast.LENGTH_SHORT).show(); - startActivityForResult(new Intent(MainActivity.this, - ActionActivity.class), WIFI_CONNECTION_REQUEST); + } + }); - overridePendingTransition(R.anim.slide_in_left, - R.anim.slide_out_left); - } - }).start(); + isWifiAvailable = Network.isWifiConnected(this); + connectivityAvailable = isWifiAvailable || Network.isConnectivityAvailable(this); - System.setCurrentTarget(position); - Toast.makeText(MainActivity.this, - getString(R.string.selected_) + System.getCurrentTarget(), - Toast.LENGTH_SHORT).show(); + // make sure system object was correctly initialized during application + // startup + if (!System.isInitialized()) { + // wifi available but system failed to initialize, this is a fatal + // :( + if (isWifiAvailable) { - } - }); - - isWifiAvailable = Network.isWifiConnected(this); - connectivityAvailable = isWifiAvailable || Network.isConnectivityAvailable(this); - - // make sure system object was correctly initialized during application - // startup - if (!System.isInitialized()) { - // wifi available but system failed to initialize, this is a fatal - // :( - if (isWifiAvailable) { - - // retry - try { - System.init(MainActivity.this.getApplicationContext()); - - System.registerPlugin(new RouterPwn()); - System.registerPlugin(new Traceroute()); - System.registerPlugin(new PortScanner()); - System.registerPlugin(new Inspector()); - System.registerPlugin(new ExploitFinder()); - System.registerPlugin(new LoginCracker()); - System.registerPlugin(new Sessions()); - System.registerPlugin(new MITM()); - System.registerPlugin(new PacketForger()); - } catch (Exception e) { - if (!(e instanceof NoRouteToHostException)) - System.errorLogging(e); - - onInitializationError(System.getLastError()); - - return; - } - } + // retry + try { + System.init(MainActivity.this.getApplicationContext()); + + System.registerPlugin(new RouterPwn()); + System.registerPlugin(new Traceroute()); + System.registerPlugin(new PortScanner()); + System.registerPlugin(new Inspector()); + System.registerPlugin(new ExploitFinder()); + System.registerPlugin(new LoginCracker()); + System.registerPlugin(new Sessions()); + System.registerPlugin(new MITM()); + System.registerPlugin(new PacketForger()); + } catch (Exception e) { + if (!(e instanceof NoRouteToHostException)) + System.errorLogging(e); + + onInitializationError(System.getLastError()); + + return; } + } + } - boolean coreInstalled = System.isCoreInstalled(); - boolean coreBeating = System.isCoreInitialized(); + boolean coreInstalled = System.isCoreInstalled(); + boolean coreBeating = System.isCoreInitialized(); - if (coreInstalled && !coreBeating) { - coreBeating = startCore(); - if(coreBeating) { - onCoreBeating(); - } else if ( isRootMissing ) { - return; - } - } + if (coreInstalled && !coreBeating) { + coreBeating = startCore(); + if (coreBeating) { + onCoreBeating(); + } else if (isRootMissing) { + return; + } + } - if (!connectivityAvailable) { - if (!coreInstalled) { - onInitializationError(getString(R.string.no_core_no_connectivity)); - return; - } else if (!coreBeating) { - onInitializationError(getString(R.string.heart_attack)); - return; - } - } + if (!connectivityAvailable) { + if (!coreInstalled) { + onInitializationError(getString(R.string.no_core_no_connectivity)); + return; + } else if (!coreBeating) { + onInitializationError(getString(R.string.heart_attack)); + return; + } + } - if (!coreInstalled) { - UPDATE_MESSAGE = getString(R.string.missing_core_update); - } else if (!coreBeating) { - UPDATE_MESSAGE = getString(R.string.heart_attack_update); - } else if (!isWifiAvailable) { - UPDATE_MESSAGE = getString(R.string.no_wifi_available); - } + if (!coreInstalled) { + UPDATE_MESSAGE = getString(R.string.missing_core_update); + } else if (!coreBeating) { + UPDATE_MESSAGE = getString(R.string.heart_attack_update); + } else if (!isWifiAvailable) { + UPDATE_MESSAGE = getString(R.string.no_wifi_available); + } - if (connectivityAvailable) - startUpdateChecker(); + if (connectivityAvailable) + startUpdateChecker(); - if (coreBeating && isWifiAvailable) - startNetworkRadar(true); + if (coreBeating && isWifiAvailable) + startNetworkRadar(true); - if (!MsfRpcd.isLocal() || System.getLocalMsfVersion() != null) - StartRPCServer(); + if (!MsfRpcd.isLocal() || System.getLocalMsfVersion() != null) + StartRPCServer(); - createLayout(); - } + createLayout(); + } - @Override - public boolean onCreateOptionsMenu(Menu menu) { - MenuInflater inflater = getMenuInflater(); - inflater.inflate(R.menu.main, menu); - - if (!isWifiAvailable) { - menu.findItem(R.id.add).setVisible(false); - menu.findItem(R.id.scan).setVisible(false); - menu.findItem(R.id.new_session).setEnabled(false); - menu.findItem(R.id.save_session).setEnabled(false); - menu.findItem(R.id.restore_session).setEnabled(false); - menu.findItem(R.id.ss_monitor).setEnabled(false); - menu.findItem(R.id.ss_msfrpcd).setEnabled(false); - } + @Override + public boolean onCreateOptionsMenu(Menu menu) { + MenuInflater inflater = getMenuInflater(); + inflater.inflate(R.menu.main, menu); - mMenu = menu; + if (!isWifiAvailable) { + menu.findItem(R.id.add).setVisible(false); + menu.findItem(R.id.scan).setVisible(false); + menu.findItem(R.id.new_session).setEnabled(false); + menu.findItem(R.id.save_session).setEnabled(false); + menu.findItem(R.id.restore_session).setEnabled(false); + menu.findItem(R.id.ss_monitor).setEnabled(false); + menu.findItem(R.id.ss_msfrpcd).setEnabled(false); + } - return super.onCreateOptionsMenu(menu); + mMenu = menu; + + return super.onCreateOptionsMenu(menu); + } + + @Override + public boolean onPrepareOptionsMenu(Menu menu) { + MenuItem item = menu.findItem(R.id.ss_monitor); + + if (mNetworkRadar != null && mNetworkRadar.isRunning()) + item.setTitle(getString(R.string.stop_monitor)); + else + item.setTitle(getString(R.string.start_monitor)); + + item = menu.findItem(R.id.ss_msfrpcd); + ToolBox tools = System.getTools(); + + if (MsfRpcd.isLocal()) { + if (System.getMsfRpc() != null + || (mMsfRpcd != null && mMsfRpcd.running)) + item.setTitle(getString(R.string.stop_msfrpcd)); + else + item.setTitle(getString(R.string.start_msfrpcd)); + } else { + if (System.getMsfRpc() == null) + item.setTitle(getString(R.string.connect_msf)); + else + item.setTitle(getString(R.string.disconnect_msf)); } - @Override - public boolean onPrepareOptionsMenu(Menu menu) { - MenuItem item = menu.findItem(R.id.ss_monitor); + item.setEnabled(!MsfRpcd.isLocal() || + (tools != null && tools.msfrpcd.isEnabled() && + !System.isServiceRunning("org.csploit.android.core.UpdateService"))); - if (mNetworkRadar != null && mNetworkRadar.isRunning()) - item.setTitle(getString(R.string.stop_monitor)); - else - item.setTitle(getString(R.string.start_monitor)); + mMenu = menu; - item = menu.findItem(R.id.ss_msfrpcd); - ToolBox tools = System.getTools(); + return super.onPrepareOptionsMenu(menu); + } - if (MsfRpcd.isLocal()) { - if (System.getMsfRpc() != null - || (mMsfRpcd != null && mMsfRpcd.running)) - item.setTitle(getString(R.string.stop_msfrpcd)); - else - item.setTitle(getString(R.string.start_msfrpcd)); - } else { - if (System.getMsfRpc() == null) - item.setTitle(getString(R.string.connect_msf)); - else - item.setTitle(getString(R.string.disconnect_msf)); - } + private void targetAliasPrompt(final Target target) { - item.setEnabled(!MsfRpcd.isLocal() || - (tools != null && tools.msfrpcd.isEnabled() && - !System.isServiceRunning("org.csploit.android.core.UpdateService"))); + new InputDialog(getString(R.string.target_alias), + getString(R.string.set_alias), + target.hasAlias() ? target.getAlias() : "", true, + false, MainActivity.this, new InputDialogListener() { + @Override + public void onInputEntered(String input) { + target.setAlias(input); + mTargetAdapter.notifyDataSetChanged(); + } + }).show(); + } - mMenu = menu; + private ActionMode.Callback mActionModeCallback = new ActionMode.Callback() { - return super.onPrepareOptionsMenu(menu); + public boolean onCreateActionMode(ActionMode mode, Menu menu) { + MenuInflater inflater = mode.getMenuInflater(); + inflater.inflate(R.menu.main_multi, menu); + return true; } - private void targetAliasPrompt(final Target target) { + public boolean onPrepareActionMode(ActionMode mode, Menu menu) { + int i = mTargetAdapter.getSelectedCount(); + mode.setTitle(i + " " + getString((i > 1 ? R.string.targets_selected : R.string.target_selected))); + MenuItem item = menu.findItem(R.id.multi_action); + if (item != null) + item.setIcon((i > 1 ? android.R.drawable.ic_dialog_dialer : android.R.drawable.ic_menu_edit)); + return false; + } - new InputDialog(getString(R.string.target_alias), - getString(R.string.set_alias), - target.hasAlias() ? target.getAlias() : "", true, - false, MainActivity.this, new InputDialogListener() { - @Override - public void onInputEntered(String input) { - target.setAlias(input); - mTargetAdapter.notifyDataSetChanged(); + public boolean onActionItemClicked(ActionMode mode, MenuItem item) { + ArrayList commonPlugins = null; + + switch (item.getItemId()) { + case R.id.multi_action: + final int[] selected = mTargetAdapter.getSelectedPositions(); + if (selected.length > 1) { + commonPlugins = System.getPluginsForTarget(System.getTarget(selected[0])); + for (int i = 1; i < selected.length; i++) { + ArrayList targetPlugins = System.getPluginsForTarget(System.getTarget(selected[i])); + ArrayList removeThem = new ArrayList(); + for (Plugin p : commonPlugins) { + if (!targetPlugins.contains(p)) + removeThem.add(p); + } + for (Plugin p : removeThem) { + commonPlugins.remove(p); + } } - }).show(); - } + if (commonPlugins.size() > 0) { + final int[] actions = new int[commonPlugins.size()]; + for (int i = 0; i < actions.length; i++) + actions[i] = commonPlugins.get(i).getName(); - private ActionMode.Callback mActionModeCallback = new ActionMode.Callback() { + (new MultipleChoiceDialog(R.string.choose_method, actions, MainActivity.this, new MultipleChoiceDialog.MultipleChoiceDialogListener() { + @Override + public void onChoice(int[] choices) { + Intent intent = new Intent(MainActivity.this, MultiAttackService.class); + int[] selectedActions = new int[choices.length]; - public boolean onCreateActionMode(ActionMode mode, Menu menu) { - MenuInflater inflater = mode.getMenuInflater(); - inflater.inflate(R.menu.main_multi, menu); - return true; - } + for (int i = 0; i < selectedActions.length; i++) + selectedActions[i] = actions[choices[i]]; - public boolean onPrepareActionMode(ActionMode mode, Menu menu) { - int i = mTargetAdapter.getSelectedCount(); - mode.setTitle(i + " " + getString((i > 1 ? R.string.targets_selected : R.string.target_selected))); - MenuItem item = menu.findItem(R.id.multi_action); - if (item != null) - item.setIcon((i > 1 ? android.R.drawable.ic_dialog_dialer : android.R.drawable.ic_menu_edit)); - return false; - } + intent.putExtra(MultiAttackService.MULTI_TARGETS, selected); + intent.putExtra(MultiAttackService.MULTI_ACTIONS, selectedActions); - public boolean onActionItemClicked(ActionMode mode, MenuItem item) { - ArrayList commonPlugins = null; - - switch (item.getItemId()) { - case R.id.multi_action: - final int[] selected = mTargetAdapter.getSelectedPositions(); - if (selected.length > 1) { - commonPlugins = System.getPluginsForTarget(System.getTarget(selected[0])); - for (int i = 1; i < selected.length; i++) { - ArrayList targetPlugins = System.getPluginsForTarget(System.getTarget(selected[i])); - ArrayList removeThem = new ArrayList(); - for (Plugin p : commonPlugins) { - if (!targetPlugins.contains(p)) - removeThem.add(p); - } - for (Plugin p : removeThem) { - commonPlugins.remove(p); - } - } - if (commonPlugins.size() > 0) { - final int[] actions = new int[commonPlugins.size()]; - for (int i = 0; i < actions.length; i++) - actions[i] = commonPlugins.get(i).getName(); - - (new MultipleChoiceDialog(R.string.choose_method, actions, MainActivity.this, new MultipleChoiceDialog.MultipleChoiceDialogListener() { - @Override - public void onChoice(int[] choices) { - Intent intent = new Intent(MainActivity.this, MultiAttackService.class); - int[] selectedActions = new int[choices.length]; - - for (int i = 0; i < selectedActions.length; i++) - selectedActions[i] = actions[choices[i]]; - - intent.putExtra(MultiAttackService.MULTI_TARGETS, selected); - intent.putExtra(MultiAttackService.MULTI_ACTIONS, selectedActions); - - startService(intent); - } - })).show(); - } else { - (new ErrorDialog(getString(R.string.error), "no common actions found", MainActivity.this)).show(); - } - } else { - targetAliasPrompt(System.getTarget(selected[0])); - } - mode.finish(); // Action picked, so close the CAB - return true; - default: - return false; + startService(intent); + } + })).show(); + } else { + (new ErrorDialog(getString(R.string.error), "no common actions found", MainActivity.this)).show(); } - } + } else { + targetAliasPrompt(System.getTarget(selected[0])); + } + mode.finish(); // Action picked, so close the CAB + return true; + default: + return false; + } + } - // called when the user exits the action mode - public void onDestroyActionMode(ActionMode mode) { - mActionMode = null; - mTargetAdapter.clearSelection(); - } - }; + // called when the user exits the action mode + public void onDestroyActionMode(ActionMode mode) { + mActionMode = null; + mTargetAdapter.clearSelection(); + } + }; - public void startUpdateChecker() { - if (System.getSettings().getBoolean("PREF_CHECK_UPDATES", true)) { - new UpdateChecker(this).start(); - } else { - MainActivity.this.sendBroadcast(new Intent(UPDATE_NOT_AVAILABLE)); - } + public void startUpdateChecker() { + if (System.getSettings().getBoolean("PREF_CHECK_UPDATES", true)) { + new UpdateChecker(this).start(); + } else { + MainActivity.this.sendBroadcast(new Intent(UPDATE_NOT_AVAILABLE)); } + } - public void startNetworkRadar(boolean silent) { - stopNetworkRadar(silent); + public void startNetworkRadar(boolean silent) { + stopNetworkRadar(silent); - if (mNetworkRadar == null) { - mNetworkRadar = new NetworkRadar(this); - } + if (mNetworkRadar == null) { + mNetworkRadar = new NetworkRadar(this); + } - try { - mNetworkRadar.start(this); + try { + mNetworkRadar.start(this); - if (!silent) - runOnUiThread(new Runnable() { - @Override - public void run() { - Toast.makeText(MainActivity.this, getString(R.string.net_discovery_started), - Toast.LENGTH_SHORT).show(); - } - }); + if (!silent) + runOnUiThread(new Runnable() { + @Override + public void run() { + Toast.makeText(MainActivity.this, getString(R.string.net_discovery_started), + Toast.LENGTH_SHORT).show(); + } + }); - } catch (ChildManager.ChildNotStartedException e) { - runOnUiThread( - new Runnable() { - @Override - public void run() { - Toast.makeText(MainActivity.this, getString(R.string.child_not_started), Toast.LENGTH_LONG).show(); - } - } + } catch (ChildManager.ChildNotStartedException e) { + runOnUiThread( + new Runnable() { + @Override + public void run() { + Toast.makeText(MainActivity.this, getString(R.string.child_not_started), Toast.LENGTH_LONG).show(); + } + } - ); - } + ); } + } - public void stopNetworkRadar(boolean silent) { - if (mNetworkRadar != null && mNetworkRadar.isRunning()) { - mNetworkRadar.stop(!silent); - } + public void stopNetworkRadar(boolean silent) { + if (mNetworkRadar != null && mNetworkRadar.isRunning()) { + mNetworkRadar.stop(!silent); } - - /** - * start MSF RPC Daemon - */ - public void StartRPCServer() { - StopRPCServer(true); - - new Thread(new Runnable() { - @Override - public void run() { - SharedPreferences prefs = System.getSettings(); - - final String msfHost = prefs.getString("MSF_RPC_HOST", "127.0.0.1"); - final String msfUser = prefs.getString("MSF_RPC_USER", "msf"); - final String msfPassword = prefs.getString("MSF_RPC_PSWD", "msf"); - final int msfPort = System.MSF_RPC_PORT; - final boolean msfSsl = prefs.getBoolean("MSF_RPC_SSL", false); - - if (msfHost.equals("127.0.0.1")) { - try { - mMsfRpcd = System.getTools().msfrpcd.async( - msfUser, msfPassword, msfPort, msfSsl, - new MsfRpcd.MsfRpcdReceiver() { - @Override - public void onReady() { - try { - System.setMsfRpc(new RPCClient(msfHost, msfUser, msfPassword, msfPort, msfSsl)); - Logger.info("successfully connected to MSF RPC Daemon "); - MainActivity.this.runOnUiThread(new Runnable() { - @Override - public void run() { - Toast.makeText(MainActivity.this, "connected to MSF RPC Daemon", Toast.LENGTH_SHORT).show(); - } - }); - } catch (Exception e) { - Logger.error(e.getClass().getName() + ": " + e.getMessage()); - MainActivity.this.runOnUiThread(new Runnable() { - @Override - public void run() { - Toast.makeText(MainActivity.this, "connection to MSF RPC Daemon failed", Toast.LENGTH_LONG).show(); - } - }); - } - } - - @Override - public void onEnd(final int exitValue) { - if (exitValue == 0) - return; - - MainActivity.this.runOnUiThread(new Runnable() { - @Override - public void run() { - Toast.makeText(MainActivity.this, "MSF RPC Daemon returned #" + exitValue, Toast.LENGTH_LONG).show(); - } - }); - } - - @Override - public void onDeath(final int signal) { - MainActivity.this.runOnUiThread(new Runnable() { - @Override - public void run() { - Toast.makeText(MainActivity.this, " MSF RPC Daemon killed by signal #" + signal, Toast.LENGTH_LONG).show(); - } - }); - } - }); - } catch (ChildManager.ChildNotStartedException e) { - Logger.error(e.getMessage()); - MainActivity.this.runOnUiThread(new Runnable() { + } + + /** + * start MSF RPC Daemon + */ + public void StartRPCServer() { + StopRPCServer(true); + + new Thread(new Runnable() { + @Override + public void run() { + SharedPreferences prefs = System.getSettings(); + + final String msfHost = prefs.getString("MSF_RPC_HOST", "127.0.0.1"); + final String msfUser = prefs.getString("MSF_RPC_USER", "msf"); + final String msfPassword = prefs.getString("MSF_RPC_PSWD", "msf"); + final int msfPort = System.MSF_RPC_PORT; + final boolean msfSsl = prefs.getBoolean("MSF_RPC_SSL", false); + + if (msfHost.equals("127.0.0.1")) { + try { + mMsfRpcd = System.getTools().msfrpcd.async( + msfUser, msfPassword, msfPort, msfSsl, + new MsfRpcd.MsfRpcdReceiver() { + @Override + public void onReady() { + try { + System.setMsfRpc(new RPCClient(msfHost, msfUser, msfPassword, msfPort, msfSsl)); + Logger.info("successfully connected to MSF RPC Daemon "); + MainActivity.this.runOnUiThread(new Runnable() { @Override public void run() { - Toast.makeText(MainActivity.this, getString(R.string.child_not_started), Toast.LENGTH_LONG).show(); + Toast.makeText(MainActivity.this, "connected to MSF RPC Daemon", Toast.LENGTH_SHORT).show(); } - }); - } - } else { - try { - System.setMsfRpc(new RPCClient(msfHost, msfUser, msfPassword, msfPort, msfSsl)); - Logger.info("successfully connected to MSF RPC Daemon "); - MainActivity.this.runOnUiThread(new Runnable() { - @Override - public void run() { - Toast.makeText(MainActivity.this, "connected to MSF RPC Daemon", Toast.LENGTH_SHORT).show(); - } - }); - } catch (Exception e) { - Logger.error(e.getClass().getName() + ": " + e.getMessage()); - MainActivity.this.runOnUiThread(new Runnable() { + }); + } catch (Exception e) { + Logger.error(e.getClass().getName() + ": " + e.getMessage()); + MainActivity.this.runOnUiThread(new Runnable() { @Override public void run() { - Toast.makeText(MainActivity.this, "connection to MSF RPC Daemon failed", Toast.LENGTH_LONG).show(); + Toast.makeText(MainActivity.this, "connection to MSF RPC Daemon failed", Toast.LENGTH_LONG).show(); } - }); - } - } - } - }).start(); - } - - /** - * stop MSF RPC Daemon - * - * @param silent show an information Toast if {@code false} - */ - public void StopRPCServer(final boolean silent) { - - if (System.getMsfRpc() == null && (mMsfRpcd == null || !mMsfRpcd.running)) - return; + }); + } + } - final Child process = mMsfRpcd; - mMsfRpcd = null; + @Override + public void onEnd(final int exitValue) { + if (exitValue == 0) + return; - new Thread(new Runnable() { - @Override - public void run() { - try { - System.setMsfRpc(null); - - if (process.running) { - process.kill(2); - process.join(); - } - - if (!silent) { MainActivity.this.runOnUiThread(new Runnable() { - @Override - public void run() { - Toast.makeText(MainActivity.this, getString(R.string.rpcd_stopped), Toast.LENGTH_SHORT).show(); - } + @Override + public void run() { + Toast.makeText(MainActivity.this, "MSF RPC Daemon returned #" + exitValue, Toast.LENGTH_LONG).show(); + } }); - } - } catch (InterruptedException e) { - Logger.error("interrupted while stopping rpc daemon"); - } - } - }).start(); - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - - case R.id.add: - new InputDialog(getString(R.string.add_custom_target), - getString(R.string.enter_url), MainActivity.this, - new InputDialogListener() { - @Override - public void onInputEntered(String input) { - final Target target = Target.getFromString(input); - if (target != null) { - // refresh the target listview - MainActivity.this.runOnUiThread(new Runnable() { - @Override - public void run() { - if (System.addOrderedTarget(target) - && mTargetAdapter != null) { - mTargetAdapter - .notifyDataSetChanged(); - } - } - }); - } else - new ErrorDialog(getString(R.string.error), - getString(R.string.invalid_target), - MainActivity.this).show(); - } - }).show(); - return true; - - case R.id.scan: - if (mMenu != null) - mMenu.findItem(R.id.scan).setActionView(new ProgressBar(this)); - - new Thread(new Runnable() { - @Override - public void run() { - startNetworkRadar(true); + } + @Override + public void onDeath(final int signal) { MainActivity.this.runOnUiThread(new Runnable() { - @Override - public void run() { - if (mMenu != null) - mMenu.findItem(R.id.scan).setActionView(null); - } + @Override + public void run() { + Toast.makeText(MainActivity.this, " MSF RPC Daemon killed by signal #" + signal, Toast.LENGTH_LONG).show(); + } }); - } - }).start(); + } + }); + } catch (ChildManager.ChildNotStartedException e) { + Logger.error(e.getMessage()); + MainActivity.this.runOnUiThread(new Runnable() { + @Override + public void run() { + Toast.makeText(MainActivity.this, getString(R.string.child_not_started), Toast.LENGTH_LONG).show(); + } + }); + } + } else { + try { + System.setMsfRpc(new RPCClient(msfHost, msfUser, msfPassword, msfPort, msfSsl)); + Logger.info("successfully connected to MSF RPC Daemon "); + MainActivity.this.runOnUiThread(new Runnable() { + @Override + public void run() { + Toast.makeText(MainActivity.this, "connected to MSF RPC Daemon", Toast.LENGTH_SHORT).show(); + } + }); + } catch (Exception e) { + Logger.error(e.getClass().getName() + ": " + e.getMessage()); + MainActivity.this.runOnUiThread(new Runnable() { + @Override + public void run() { + Toast.makeText(MainActivity.this, "connection to MSF RPC Daemon failed", Toast.LENGTH_LONG).show(); + } + }); + } + } + } + }).start(); + } + + /** + * stop MSF RPC Daemon + * + * @param silent show an information Toast if {@code false} + */ + public void StopRPCServer(final boolean silent) { + + if (System.getMsfRpc() == null && (mMsfRpcd == null || !mMsfRpcd.running)) + return; + + final Child process = mMsfRpcd; + mMsfRpcd = null; + + new Thread(new Runnable() { + @Override + public void run() { + try { + System.setMsfRpc(null); - item.setTitle(getString(R.string.stop_monitor)); - return true; + if (process.running) { + process.kill(2); + process.join(); + } - case R.id.wifi_scan: - stopNetworkRadar(true); + if (!silent) { + MainActivity.this.runOnUiThread(new Runnable() { + @Override + public void run() { + Toast.makeText(MainActivity.this, getString(R.string.rpcd_stopped), Toast.LENGTH_SHORT).show(); + } + }); + } + } catch (InterruptedException e) { + Logger.error("interrupted while stopping rpc daemon"); + } + } + }).start(); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + + case R.id.add: + new InputDialog(getString(R.string.add_custom_target), + getString(R.string.enter_url), MainActivity.this, + new InputDialogListener() { + @Override + public void onInputEntered(String input) { + final Target target = Target.getFromString(input); + if (target != null) { + // refresh the target listview + MainActivity.this.runOnUiThread(new Runnable() { + @Override + public void run() { + if (System.addOrderedTarget(target) + && mTargetAdapter != null) { + mTargetAdapter + .notifyDataSetChanged(); + } + } + }); + } else + new ErrorDialog(getString(R.string.error), + getString(R.string.invalid_target), + MainActivity.this).show(); + } + }).show(); + return true; + + case R.id.scan: + if (mMenu != null) + mMenu.findItem(R.id.scan).setActionView(new ProgressBar(this)); - mRadarReceiver.unregister(); - mUpdateReceiver.unregister(); + new Thread(new Runnable() { + @Override + public void run() { + startNetworkRadar(true); - startActivityForResult(new Intent(MainActivity.this, - WifiScannerActivity.class), WIFI_CONNECTION_REQUEST); - return true; + MainActivity.this.runOnUiThread(new Runnable() { + @Override + public void run() { + if (mMenu != null) + mMenu.findItem(R.id.scan).setActionView(null); + } + }); + } + }).start(); - case R.id.new_session: - new ConfirmDialog(getString(R.string.warning), - getString(R.string.warning_new_session), this, - new ConfirmDialogListener() { - @Override - public void onConfirm() { - try { - System.reset(); - mTargetAdapter.notifyDataSetChanged(); - - Toast.makeText( - MainActivity.this, - getString(R.string.new_session_started), - Toast.LENGTH_SHORT).show(); - } catch (Exception e) { - new FatalDialog(getString(R.string.error), e - .toString(), MainActivity.this).show(); - } - } + item.setTitle(getString(R.string.stop_monitor)); + return true; - @Override - public void onCancel() { - } + case R.id.wifi_scan: + stopNetworkRadar(true); - }).show(); + mRadarReceiver.unregister(); + mUpdateReceiver.unregister(); - return true; + startActivityForResult(new Intent(MainActivity.this, + WifiScannerActivity.class), WIFI_CONNECTION_REQUEST); + return true; - case R.id.save_session: - new InputDialog(getString(R.string.save_session), - getString(R.string.enter_session_name), - System.getSessionName(), true, false, MainActivity.this, - new InputDialogListener() { - @Override - public void onInputEntered(String input) { - String name = input.trim().replace("/", "") - .replace("..", ""); - - if (!name.isEmpty()) { - try { - String filename = System.saveSession(name); - - Toast.makeText( - MainActivity.this, - getString(R.string.session_saved_to) - + filename + " .", - Toast.LENGTH_SHORT).show(); - } catch (IOException e) { - new ErrorDialog(getString(R.string.error), - e.toString(), MainActivity.this) - .show(); - } - } else - new ErrorDialog(getString(R.string.error), - getString(R.string.invalid_session), - MainActivity.this).show(); - } - }).show(); - return true; - - case R.id.restore_session: - final ArrayList sessions = System - .getAvailableSessionFiles(); - - if (sessions != null && sessions.size() > 0) { - new SpinnerDialog(getString(R.string.select_session), - getString(R.string.select_session_file), - sessions.toArray(new String[sessions.size()]), - MainActivity.this, new SpinnerDialogListener() { - @Override - public void onItemSelected(int index) { - String session = sessions.get(index); - - try { - System.loadSession(session); - mTargetAdapter.notifyDataSetChanged(); - } catch (Exception e) { - e.printStackTrace(); - new ErrorDialog(getString(R.string.error), - e.getMessage(), MainActivity.this) - .show(); - } - } - }).show(); - } else - new ErrorDialog(getString(R.string.error), - getString(R.string.no_session_found), MainActivity.this) - .show(); - return true; - - case R.id.settings: - startActivity(new Intent(MainActivity.this, SettingsActivity.class)); - return true; - - case R.id.ss_monitor: - if (mNetworkRadar != null && mNetworkRadar.isRunning()) { - stopNetworkRadar(false); - - item.setTitle(getString(R.string.start_monitor)); - } else { + case R.id.new_session: + new ConfirmDialog(getString(R.string.warning), + getString(R.string.warning_new_session), this, + new ConfirmDialogListener() { + @Override + public void onConfirm() { try { - startNetworkRadar(false); + System.reset(); + mTargetAdapter.notifyDataSetChanged(); - item.setTitle(getString(R.string.stop_monitor)); + Toast.makeText( + MainActivity.this, + getString(R.string.new_session_started), + Toast.LENGTH_SHORT).show(); } catch (Exception e) { - new ErrorDialog(getString(R.string.error), e.getMessage(), MainActivity.this).show(); + new FatalDialog(getString(R.string.error), e + .toString(), MainActivity.this).show(); } - } - return true; - - case R.id.ss_msfrpcd: - if (System.getMsfRpc() != null || (mMsfRpcd != null && mMsfRpcd.running)) { - StopRPCServer(false); - if (MsfRpcd.isLocal()) - item.setTitle(R.string.start_msfrpcd); - else - item.setTitle(R.string.connect_msf); - } else { - StartRPCServer(); - if (MsfRpcd.isLocal()) - item.setTitle(R.string.stop_msfrpcd); - else - item.setTitle(R.string.disconnect_msf); - } - return true; + } + + @Override + public void onCancel() { + } + + }).show(); + + return true; + + case R.id.save_session: + new InputDialog(getString(R.string.save_session), + getString(R.string.enter_session_name), + System.getSessionName(), true, false, MainActivity.this, + new InputDialogListener() { + @Override + public void onInputEntered(String input) { + String name = input.trim().replace("/", "") + .replace("..", ""); + + if (!name.isEmpty()) { + try { + String filename = System.saveSession(name); + + Toast.makeText( + MainActivity.this, + getString(R.string.session_saved_to) + + filename + " .", + Toast.LENGTH_SHORT).show(); + } catch (IOException e) { + new ErrorDialog(getString(R.string.error), + e.toString(), MainActivity.this) + .show(); + } + } else + new ErrorDialog(getString(R.string.error), + getString(R.string.invalid_session), + MainActivity.this).show(); + } + }).show(); + return true; + + case R.id.restore_session: + final ArrayList sessions = System + .getAvailableSessionFiles(); + + if (sessions != null && sessions.size() > 0) { + new SpinnerDialog(getString(R.string.select_session), + getString(R.string.select_session_file), + sessions.toArray(new String[sessions.size()]), + MainActivity.this, new SpinnerDialogListener() { + @Override + public void onItemSelected(int index) { + String session = sessions.get(index); - case R.id.submit_issue: - String uri = getString(R.string.github_issues); - Intent browser = new Intent(Intent.ACTION_VIEW, Uri.parse(uri)); - startActivity(browser); - return true; + try { + System.loadSession(session); + mTargetAdapter.notifyDataSetChanged(); + } catch (Exception e) { + e.printStackTrace(); + new ErrorDialog(getString(R.string.error), + e.getMessage(), MainActivity.this) + .show(); + } + } + }).show(); + } else + new ErrorDialog(getString(R.string.error), + getString(R.string.no_session_found), MainActivity.this) + .show(); + return true; + + case R.id.settings: + startActivity(new Intent(MainActivity.this, SettingsActivity.class)); + return true; + + case R.id.ss_monitor: + if (mNetworkRadar != null && mNetworkRadar.isRunning()) { + stopNetworkRadar(false); - case R.id.about: - new AboutDialog(this).show(); - return true; + item.setTitle(getString(R.string.start_monitor)); + } else { + try { + startNetworkRadar(false); - default: - return super.onOptionsItemSelected(item); + item.setTitle(getString(R.string.stop_monitor)); + } catch (Exception e) { + new ErrorDialog(getString(R.string.error), e.getMessage(), MainActivity.this).show(); + } } - } - - - @Override - public void onBackPressed() { - if (mLastBackPressTime < java.lang.System.currentTimeMillis() - 4000) { - mToast = Toast.makeText(this, getString(R.string.press_back), - Toast.LENGTH_SHORT); - mToast.show(); - mLastBackPressTime = java.lang.System.currentTimeMillis(); + return true; + + case R.id.ss_msfrpcd: + if (System.getMsfRpc() != null || (mMsfRpcd != null && mMsfRpcd.running)) { + StopRPCServer(false); + if (MsfRpcd.isLocal()) + item.setTitle(R.string.start_msfrpcd); + else + item.setTitle(R.string.connect_msf); } else { - if (mToast != null) - mToast.cancel(); + StartRPCServer(); + if (MsfRpcd.isLocal()) + item.setTitle(R.string.stop_msfrpcd); + else + item.setTitle(R.string.disconnect_msf); + } + return true; - new ConfirmDialog(getString(R.string.exit), - getString(R.string.close_confirm), this, - new ConfirmDialogListener() { - @Override - public void onConfirm() { - MainActivity.this.finish(); - } + case R.id.submit_issue: + String uri = getString(R.string.github_issues); + Intent browser = new Intent(Intent.ACTION_VIEW, Uri.parse(uri)); + startActivity(browser); + return true; - @Override - public void onCancel() { - } - }).show(); + case R.id.about: + new AboutDialog(this).show(); + return true; - mLastBackPressTime = 0; - } + default: + return super.onOptionsItemSelected(item); } + } + + + @Override + public void onBackPressed() { + if (mLastBackPressTime < java.lang.System.currentTimeMillis() - 4000) { + mToast = Toast.makeText(this, getString(R.string.press_back), + Toast.LENGTH_SHORT); + mToast.show(); + mLastBackPressTime = java.lang.System.currentTimeMillis(); + } else { + if (mToast != null) + mToast.cancel(); + + new ConfirmDialog(getString(R.string.exit), + getString(R.string.close_confirm), this, + new ConfirmDialogListener() { + @Override + public void onConfirm() { + MainActivity.this.finish(); + } - @Override - public void onDestroy() { - stopNetworkRadar(true); - StopRPCServer(true); - - mRadarReceiver.unregister(); - mUpdateReceiver.unregister(); - mWipeReceiver.unregister(); - - // make sure no zombie process is running before destroying the activity - System.clean(true); + @Override + public void onCancel() { + } + }).show(); - super.onDestroy(); + mLastBackPressTime = 0; + } + } + + @Override + public void onDestroy() { + stopNetworkRadar(true); + StopRPCServer(true); + + mRadarReceiver.unregister(); + mUpdateReceiver.unregister(); + mWipeReceiver.unregister(); + + // make sure no zombie process is running before destroying the activity + System.clean(true); + + super.onDestroy(); + } + + @Override + public void onTargetFound(final Target t) { + runOnUiThread(new Runnable() { + @Override + public void run() { + if (System.addOrderedTarget(t) && mTargetAdapter != null) { + mTargetAdapter.notifyDataSetChanged(); + } + } + }); + } + + @Override + public void onTargetChanged(final Target t) { + runOnUiThread(new Runnable() { + @Override + public void run() { + if (mTargetAdapter != null) + mTargetAdapter.notifyDataSetChanged(); + } + }); + } + + public class TargetAdapter extends ArrayAdapter { + public TargetAdapter() { + super(MainActivity.this, R.layout.target_list_item); } @Override - public void onTargetFound(final Target t) { - runOnUiThread(new Runnable() { - @Override - public void run() { - if (System.addOrderedTarget(t) && mTargetAdapter != null) { - mTargetAdapter.notifyDataSetChanged(); - } - } - }); + public int getCount() { + return System.getTargets().size(); } @Override - public void onTargetChanged(final Target t) { - runOnUiThread(new Runnable() { - @Override - public void run() { - if (mTargetAdapter != null) - mTargetAdapter.notifyDataSetChanged(); - } - }); - } + public View getView(int position, View convertView, ViewGroup parent) { + View row = convertView; + TargetHolder holder; - public class TargetAdapter extends ArrayAdapter { - public TargetAdapter() { - super(MainActivity.this, R.layout.target_list_item); - } + if (row == null) { + LayoutInflater inflater = (LayoutInflater) MainActivity.this + .getSystemService(Context.LAYOUT_INFLATER_SERVICE); + row = inflater + .inflate(R.layout.target_list_item, parent, false); - @Override - public int getCount() { - return System.getTargets().size(); - } + holder = new TargetHolder(); + holder.itemImage = (ImageView) (row != null ? row + .findViewById(R.id.itemIcon) : null); + holder.itemTitle = (TextView) (row != null ? row + .findViewById(R.id.itemTitle) : null); + holder.itemDescription = (TextView) (row != null ? row + .findViewById(R.id.itemDescription) : null); - @Override - public View getView(int position, View convertView, ViewGroup parent) { - View row = convertView; - TargetHolder holder; + if (row != null) + row.setTag(holder); + } else + holder = (TargetHolder) row.getTag(); - if (row == null) { - LayoutInflater inflater = (LayoutInflater) MainActivity.this - .getSystemService(Context.LAYOUT_INFLATER_SERVICE); - row = inflater - .inflate(R.layout.target_list_item, parent, false); + Target target = System.getTarget(position); - holder = new TargetHolder(); - holder.itemImage = (ImageView) (row != null ? row - .findViewById(R.id.itemIcon) : null); - holder.itemTitle = (TextView) (row != null ? row - .findViewById(R.id.itemTitle) : null); - holder.itemDescription = (TextView) (row != null ? row - .findViewById(R.id.itemDescription) : null); + if (target.hasAlias()) + holder.itemTitle.setText(Html.fromHtml("" + + target.getAlias() + " ( " + + target.getDisplayAddress() + " )")); - if (row != null) - row.setTag(holder); - } else - holder = (TargetHolder) row.getTag(); + else + holder.itemTitle.setText(target.toString()); - Target target = System.getTarget(position); + holder.itemTitle.setTextColor(getResources().getColor((target.isConnected() ? R.color.app_color : R.color.gray_text))); - if (target.hasAlias()) - holder.itemTitle.setText(Html.fromHtml("" - + target.getAlias() + " ( " - + target.getDisplayAddress() + " )")); + if (row != null) + row.setBackgroundColor(getResources().getColor((target.isSelected() ? R.color.background_material_dark : android.R.color.transparent))); - else - holder.itemTitle.setText(target.toString()); + holder.itemTitle.setTypeface(null, Typeface.NORMAL); + holder.itemImage.setImageResource(target.getDrawableResourceId()); + holder.itemDescription.setText(target.getDescription()); - holder.itemTitle.setTextColor(getResources().getColor((target.isConnected() ? R.color.app_color : R.color.gray_text))); + return row; + } - if (row != null) - row.setBackgroundColor(getResources().getColor((target.isSelected() ? R.color.background_material_dark : android.R.color.transparent))); + public void clearSelection() { + for (Target t : System.getTargets()) + t.setSelected(false); + notifyDataSetChanged(); + if (mActionMode != null) + mActionMode.finish(); + } - holder.itemTitle.setTypeface(null, Typeface.NORMAL); - holder.itemImage.setImageResource(target.getDrawableResourceId()); - holder.itemDescription.setText(target.getDescription()); + public void toggleSelection(int position) { + Target t = System.getTarget(position); + t.setSelected(!t.isSelected()); + notifyDataSetChanged(); + if (mActionMode != null) { + if (getSelectedCount() > 0) + mActionMode.invalidate(); + else + mActionMode.finish(); + } + } - return row; - } + public int getSelectedCount() { + int i = 0; + for (Target t : System.getTargets()) + if (t.isSelected()) + i++; + return i; + } - public void clearSelection() { - for (Target t : System.getTargets()) - t.setSelected(false); - notifyDataSetChanged(); - if (mActionMode != null) - mActionMode.finish(); - } + public ArrayList getSelected() { + ArrayList result = new ArrayList(); + for (Target t : System.getTargets()) + if (t.isSelected()) + result.add(t); + return result; + } - public void toggleSelection(int position) { - Target t = System.getTarget(position); - t.setSelected(!t.isSelected()); - notifyDataSetChanged(); - if (mActionMode != null) { - if (getSelectedCount() > 0) - mActionMode.invalidate(); - else - mActionMode.finish(); - } - } + public int[] getSelectedPositions() { + int[] res = new int[getSelectedCount()]; + int j = 0; - public int getSelectedCount() { - int i = 0; - for (Target t : System.getTargets()) - if (t.isSelected()) - i++; - return i; - } + for (int i = 0; i < System.getTargets().size(); i++) + if (System.getTarget(i).isSelected()) + res[j++] = i; + return res; + } - public ArrayList getSelected() { - ArrayList result = new ArrayList(); - for (Target t : System.getTargets()) - if (t.isSelected()) - result.add(t); - return result; - } + class TargetHolder { + ImageView itemImage; + TextView itemTitle; + TextView itemDescription; + } + } - public int[] getSelectedPositions() { - int[] res = new int[getSelectedCount()]; - int j = 0; + private class RadarReceiver extends ManagedReceiver { + private IntentFilter mFilter = null; - for (int i = 0; i < System.getTargets().size(); i++) - if (System.getTarget(i).isSelected()) - res[j++] = i; - return res; - } + public RadarReceiver() { + mFilter = new IntentFilter(); - class TargetHolder { - ImageView itemImage; - TextView itemTitle; - TextView itemDescription; - } + mFilter.addAction(NRDR_STOPPED); } - private class RadarReceiver extends ManagedReceiver { - private IntentFilter mFilter = null; + public IntentFilter getFilter() { + return mFilter; + } - public RadarReceiver() { - mFilter = new IntentFilter(); + @SuppressWarnings("ConstantConditions") + @Override + public void onReceive(Context context, Intent intent) { + if (intent.getAction() == null) + return; - mFilter.addAction(NRDR_STOPPED); - } + if (intent.getAction().equals(NRDR_STOPPED)) { - public IntentFilter getFilter() { - return mFilter; - } + Toast.makeText(MainActivity.this, R.string.net_discovery_stopped, + Toast.LENGTH_SHORT).show(); + } + } + } - @SuppressWarnings("ConstantConditions") - @Override - public void onReceive(Context context, Intent intent) { - if (intent.getAction() == null) - return; + private class WipeReceiver extends ManagedReceiver { + private IntentFilter mFilter = null; - if (intent.getAction().equals(NRDR_STOPPED)) { + public WipeReceiver() { + mFilter = new IntentFilter(); - Toast.makeText(MainActivity.this, R.string.net_discovery_stopped, - Toast.LENGTH_SHORT).show(); - } - } + mFilter.addAction(SettingsActivity.SETTINGS_WIPE_START); } - private class WipeReceiver extends ManagedReceiver { - private IntentFilter mFilter = null; + public IntentFilter getFilter() { + return mFilter; + } - public WipeReceiver() { - mFilter = new IntentFilter(); + @Override + public void onReceive(Context context, Intent intent) { - mFilter.addAction(SettingsActivity.SETTINGS_WIPE_START); - } + if (intent.getAction().equals(SettingsActivity.SETTINGS_WIPE_START)) { + try { + String path; - public IntentFilter getFilter() { - return mFilter; - } + if (intent.hasExtra(SettingsActivity.SETTINGS_WIPE_DIR)) { + path = intent.getStringExtra(SettingsActivity.SETTINGS_WIPE_DIR); + } else { + path = System.getRubyPath() + "' '" + System.getMsfPath(); + } - @Override - public void onReceive(Context context, Intent intent) { + StopRPCServer(true); + System.getTools().raw.async("rm -rf '" + path + "'", new Child.EventReceiver() { + @Override + public void onEnd(int exitCode) { + MainActivity.this.sendBroadcast(new Intent(SettingsActivity.SETTINGS_WIPE_DONE)); + } + + @Override + public void onDeath(int signal) { + MainActivity.this.sendBroadcast(new Intent(SettingsActivity.SETTINGS_WIPE_DONE)); + } - if (intent.getAction().equals(SettingsActivity.SETTINGS_WIPE_START)) { - try { - String path; + @Override + public void onEvent(Event e) { + } + }); + } catch (Exception e) { + System.errorLogging(e); + } + } + } + } + + private class UpdateReceiver extends ManagedReceiver { + private IntentFilter mFilter = null; + + public UpdateReceiver() { + mFilter = new IntentFilter(); + + mFilter.addAction(UPDATE_CHECKING); + mFilter.addAction(UPDATE_AVAILABLE); + mFilter.addAction(UPDATE_NOT_AVAILABLE); + mFilter.addAction(CORE_AVAILABLE); + mFilter.addAction(RUBY_AVAILABLE); + mFilter.addAction(GEMS_AVAILABLE); + mFilter.addAction(MSF_AVAILABLE); + mFilter.addAction(UpdateService.ERROR); + mFilter.addAction(UpdateService.DONE); + } - if (intent.hasExtra(SettingsActivity.SETTINGS_WIPE_DIR)) { - path = intent.getStringExtra(SettingsActivity.SETTINGS_WIPE_DIR); - } else { - path = System.getRubyPath() + "' '" + System.getMsfPath(); - } + public IntentFilter getFilter() { + return mFilter; + } - StopRPCServer(true); - System.getTools().raw.async("rm -rf '" + path + "'", new Child.EventReceiver() { - @Override - public void onEnd(int exitCode) { - MainActivity.this.sendBroadcast(new Intent(SettingsActivity.SETTINGS_WIPE_DONE)); - } + private void onUpdateAvailable(final String desc, final UpdateService.action target, final boolean mandatory) { + MainActivity.this.runOnUiThread(new Runnable() { + @Override + public void run() { + new ConfirmDialog(getString(R.string.update_available), + desc, MainActivity.this, new ConfirmDialogListener() { + @Override + public void onConfirm() { + StopRPCServer(true); + Intent i = new Intent(MainActivity.this, UpdateService.class); + i.setAction(UpdateService.START); + i.putExtra(UpdateService.ACTION, target); - @Override - public void onDeath(int signal) { - MainActivity.this.sendBroadcast(new Intent(SettingsActivity.SETTINGS_WIPE_DONE)); - } + startService(i); + } - @Override - public void onEvent(Event e) { - } - }); - } catch (Exception e) { - System.errorLogging(e); - } + @Override + public void onCancel() { + if (!mandatory) { + return; + } + + onInitializationError(getString(R.string.mandatory_update)); } + } + ).show(); } + }); } - private class UpdateReceiver extends ManagedReceiver { - private IntentFilter mFilter = null; - - public UpdateReceiver() { - mFilter = new IntentFilter(); - - mFilter.addAction(UPDATE_CHECKING); - mFilter.addAction(UPDATE_AVAILABLE); - mFilter.addAction(UPDATE_NOT_AVAILABLE); - mFilter.addAction(CORE_AVAILABLE); - mFilter.addAction(RUBY_AVAILABLE); - mFilter.addAction(GEMS_AVAILABLE); - mFilter.addAction(MSF_AVAILABLE); - mFilter.addAction(UpdateService.ERROR); - mFilter.addAction(UpdateService.DONE); - } + private void onUpdateAvailable(final String desc, final UpdateService.action target) { + onUpdateAvailable(desc, target, false); + } - public IntentFilter getFilter() { - return mFilter; - } + private void onUpdateDone(UpdateService.action target) { - private void onUpdateAvailable(final String desc, final UpdateService.action target, final boolean mandatory) { - MainActivity.this.runOnUiThread(new Runnable() { - @Override - public void run() { - new ConfirmDialog(getString(R.string.update_available), - desc, MainActivity.this, new ConfirmDialogListener() { - @Override - public void onConfirm() { - StopRPCServer(true); - Intent i = new Intent(MainActivity.this, UpdateService.class); - i.setAction(UpdateService.START); - i.putExtra(UpdateService.ACTION, target); + System.reloadTools(); - startService(i); - } + switch (target) { + case ruby_update: + case msf_update: + StartRPCServer(); + break; + case core_update: + onCoreUpdated(); + break; + } - @Override - public void onCancel() { - if (!mandatory) { - return; - } + // restart update checker after a successful update + startUpdateChecker(); + } - onInitializationError(getString(R.string.mandatory_update)); - } - } - ).show(); - } - }); - } + private void onUpdateError(UpdateService.action target, final int message) { + + if (target == UpdateService.action.core_update) { + onInitializationError(getString(message)); + return; + } - private void onUpdateAvailable(final String desc, final UpdateService.action target) { - onUpdateAvailable(desc, target, false); + MainActivity.this.runOnUiThread(new Runnable() { + @Override + public void run() { + new ErrorDialog(getString(R.string.error), + getString(message), MainActivity.this).show(); } + }); + + System.reloadTools(); + } - private void onUpdateDone(UpdateService.action target) { + @SuppressWarnings("ConstantConditions") + @Override + public void onReceive(Context context, Intent intent) { + if (intent.getAction().equals(UPDATE_CHECKING)) { - System.reloadTools(); + if (mUpdateStatus != null) + mUpdateStatus.setText(UPDATE_MESSAGE.replace( + "#STATUS#", getString(R.string.checking))); - switch (target) { - case ruby_update: - case msf_update: - StartRPCServer(); - break; - case core_update: - onCoreUpdated(); - break; - } + } else if (intent.getAction().equals(UPDATE_NOT_AVAILABLE)) { - // restart update checker after a successful update - startUpdateChecker(); + if (mUpdateStatus != null) + mUpdateStatus.setText(UPDATE_MESSAGE.replace( + "#STATUS#", getString(R.string.no_updates_available))); + + if (!System.isCoreInitialized()) { + new FatalDialog(getString(R.string.initialization_error), + getString(R.string.no_core_found), MainActivity.this).show(); } - private void onUpdateError(UpdateService.action target, final int message) { + } else if (intent.getAction().equals(RUBY_AVAILABLE)) { + final String description = getString(R.string.new_ruby_update_desc) + " " + + getString(R.string.new_update_desc2); - if (target == UpdateService.action.core_update) { - onInitializationError(getString(message)); - return; - } - - MainActivity.this.runOnUiThread(new Runnable() { - @Override - public void run() { - new ErrorDialog(getString(R.string.error), - getString(message), MainActivity.this).show(); - } - }); + onUpdateAvailable(description, UpdateService.action.ruby_update); + } else if (intent.getAction().equals(MSF_AVAILABLE)) { + if (mUpdateStatus != null) + mUpdateStatus.setText(UPDATE_MESSAGE.replace( + "#STATUS#", + getString(R.string.new_version) + " " + + getString(R.string.new_version2) + )); - System.reloadTools(); - } + final String description = getString(R.string.new_msf_update_desc) + " " + + getString(R.string.new_update_desc2); - @SuppressWarnings("ConstantConditions") - @Override - public void onReceive(Context context, Intent intent) { - if (intent.getAction().equals(UPDATE_CHECKING)) { + onUpdateAvailable(description, UpdateService.action.msf_update); + } else if (intent.getAction().equals(UPDATE_AVAILABLE)) { + final String remoteVersion = (String) intent.getExtras().get( + AVAILABLE_VERSION); - if (mUpdateStatus != null) - mUpdateStatus.setText(UPDATE_MESSAGE.replace( - "#STATUS#", getString(R.string.checking))); + if (mUpdateStatus != null) + mUpdateStatus.setText(UPDATE_MESSAGE.replace( + "#STATUS#", getString(R.string.new_version) + + remoteVersion + + getString(R.string.new_version2))); - } else if (intent.getAction().equals(UPDATE_NOT_AVAILABLE)) { + final String description = getString(R.string.new_update_desc) + + " " + remoteVersion + " " + + getString(R.string.new_update_desc2); - if (mUpdateStatus != null) - mUpdateStatus.setText(UPDATE_MESSAGE.replace( - "#STATUS#", getString(R.string.no_updates_available))); + onUpdateAvailable(description, UpdateService.action.apk_update); + } else if (intent.getAction().equals(CORE_AVAILABLE)) { - if (!System.isCoreInitialized()) { - new FatalDialog(getString(R.string.initialization_error), - getString(R.string.no_core_found), MainActivity.this).show(); - } + final String remoteVersion = (String) intent.getExtras().get( + AVAILABLE_VERSION); - } else if (intent.getAction().equals(RUBY_AVAILABLE)) { - final String description = getString(R.string.new_ruby_update_desc) + " " + - getString(R.string.new_update_desc2); - - onUpdateAvailable(description, UpdateService.action.ruby_update); - } else if (intent.getAction().equals(MSF_AVAILABLE)) { - if (mUpdateStatus != null) - mUpdateStatus.setText(UPDATE_MESSAGE.replace( - "#STATUS#", - getString(R.string.new_version) + " " + - getString(R.string.new_version2) - )); - - final String description = getString(R.string.new_msf_update_desc) + " " + - getString(R.string.new_update_desc2); - - onUpdateAvailable(description, UpdateService.action.msf_update); - } else if (intent.getAction().equals(UPDATE_AVAILABLE)) { - final String remoteVersion = (String) intent.getExtras().get( - AVAILABLE_VERSION); - - if (mUpdateStatus != null) - mUpdateStatus.setText(UPDATE_MESSAGE.replace( - "#STATUS#", getString(R.string.new_version) - + remoteVersion - + getString(R.string.new_version2))); - - final String description = getString(R.string.new_update_desc) - + " " + remoteVersion + " " - + getString(R.string.new_update_desc2); - - onUpdateAvailable(description, UpdateService.action.apk_update); - } else if (intent.getAction().equals(CORE_AVAILABLE)) { - - final String remoteVersion = (String) intent.getExtras().get( - AVAILABLE_VERSION); - - if (mUpdateStatus != null) - mUpdateStatus.setText(UPDATE_MESSAGE.replace( - "#STATUS#", getString(R.string.new_version) + " " + - getString(R.string.new_version2))); - - final String description = String.format(getString(R.string.new_core_found), remoteVersion); - - onUpdateAvailable(description, UpdateService.action.core_update, !System.isCoreInstalled()); - } else if (intent.getAction().equals(UpdateService.ERROR)) { - onUpdateError((UpdateService.action) intent.getSerializableExtra(UpdateService.ACTION), - intent.getIntExtra(UpdateService.MESSAGE, R.string.error_occured)); - } else if (intent.getAction().equals(UpdateService.DONE)) { - onUpdateDone((UpdateService.action) intent.getSerializableExtra(UpdateService.ACTION)); - } - } + if (mUpdateStatus != null) + mUpdateStatus.setText(UPDATE_MESSAGE.replace( + "#STATUS#", getString(R.string.new_version) + " " + + getString(R.string.new_version2))); + + final String description = String.format(getString(R.string.new_core_found), remoteVersion); + + onUpdateAvailable(description, UpdateService.action.core_update, !System.isCoreInstalled()); + } else if (intent.getAction().equals(UpdateService.ERROR)) { + onUpdateError((UpdateService.action) intent.getSerializableExtra(UpdateService.ACTION), + intent.getIntExtra(UpdateService.MESSAGE, R.string.error_occured)); + } else if (intent.getAction().equals(UpdateService.DONE)) { + onUpdateDone((UpdateService.action) intent.getSerializableExtra(UpdateService.ACTION)); + } } + } } \ No newline at end of file From 9181a60c9cbfcde1ce8e81d59e0652e68400cd39 Mon Sep 17 00:00:00 2001 From: tux_mind Date: Mon, 21 Sep 2015 01:37:56 +0200 Subject: [PATCH 9/9] version bump --- cSploit/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cSploit/build.gradle b/cSploit/build.gradle index 089a905c18..9ae007740f 100644 --- a/cSploit/build.gradle +++ b/cSploit/build.gradle @@ -53,7 +53,7 @@ android { minSdkVersion 9 targetSdkVersion 22 versionCode 1 - versionName "1.5.3" + versionName "1.5.4" } signingConfigs {