From c1d6d7a36cf14d0a5b696be2e2438f248ef7a69f Mon Sep 17 00:00:00 2001
From: aevw <69059460+aevw@users.noreply.github.com>
Date: Mon, 7 Sep 2020 17:45:04 -0300
Subject: [PATCH 01/52] Create strings.xml
pt_BR to dev branch
---
app/src/main/res/values-pt-rBR/strings.xml | 59 ++++++++++++++++++++++
1 file changed, 59 insertions(+)
create mode 100644 app/src/main/res/values-pt-rBR/strings.xml
diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml
new file mode 100644
index 00000000..51690320
--- /dev/null
+++ b/app/src/main/res/values-pt-rBR/strings.xml
@@ -0,0 +1,59 @@
+
+
+
+ Port Authority
+ Configurações
+ MAC
+ Fabricante
+ IP do LAN
+ IP do WAN
+ Extraindo…
+ Sinal/Velocidade
+ Descubra os servidores
+ SSID
+ BSSID
+ Examinar as Portas Conhecidas
+ Examinar Intervalo das Portas
+ Reiniciar Intervalo das Portas
+ As Portas Abertas
+ Iniciar a Porta
+ Parar a Porta
+ WiFi desativado
+ Sem conexão WiFi
+ URL/IP
+ ATENÇÃO
+ Nome do domínio
+ Consulta o DNS
+ Ativação
+ Ativando %1$s…
+ Endereço do IP
+ Extraindo registros do DNS …
+ Digite um domínio e selecione um tipo de registro
+ Você não está conectado à rede local
+ Você não está conectado à rede WiFi
+ %1$ddBm/%2$dMbps
+ Procurando os servidores
+ %1$d hosts na sua sub-rede
+ Ordenar
+ Por nome do servidor
+ Pelo fabricante
+ Copiar nome do servidor
+ Copiar o IP
+ Copiar o MAC
+ Falha ao obter o fabricante do MAC
+ Falha ao abrir a base de dados
+ Baixando base de dados
+ Falha ao obter o número dos servidores na sub-rede
+ Falha ao obter a força do sinal
+ Falha ao obter a velocidade do link
+ Falha ao obter o SSID
+ Falha ao obter o BSSID
+ Falha ao obter Gerenciador do Wifi para este dispositivo
+ Nenhuma interface do WiFi encontrada
+
+ Por favor, esteja ciente de que executar examinador das portas contra servidores públicos é normalmente considerado malicioso.
+ Além disso, a execução destes tipos de exames na rede da sua operadora em vez da sua própria conexão WiFi (ou LAN) será mais lenta e às vezes produzirá resultados imprecisos devido à modelagem do tráfego.
+ Sua operadora também pode considerar o tráfego gerado por este tipo de examinação como sendo malicioso.
+
+
+
From 63428a31f3ed447018c72901a7c3282f81754506 Mon Sep 17 00:00:00 2001
From: Aaron Wood
Date: Mon, 14 Sep 2020 00:22:00 -0700
Subject: [PATCH 02/52] Remove check for impossible case
---
.../java/com/aaronjwood/portauthority/network/Wireless.java | 4 ----
1 file changed, 4 deletions(-)
diff --git a/app/src/main/java/com/aaronjwood/portauthority/network/Wireless.java b/app/src/main/java/com/aaronjwood/portauthority/network/Wireless.java
index ef4850df..8b4caf95 100644
--- a/app/src/main/java/com/aaronjwood/portauthority/network/Wireless.java
+++ b/app/src/main/java/com/aaronjwood/portauthority/network/Wireless.java
@@ -150,10 +150,6 @@ public T getInternalWifiIpAddress(Class type) throws UnknownHostException
*/
public int getInternalWifiSubnet() throws NoWifiManagerException {
WifiManager wifiManager = getWifiManager();
- if (wifiManager == null) {
- return 0;
- }
-
DhcpInfo dhcpInfo = wifiManager.getDhcpInfo();
if (dhcpInfo == null) {
return 0;
From a8b9d6f46258a93f302b48e0bb7ef5069b0a7360 Mon Sep 17 00:00:00 2001
From: Aaron Wood
Date: Mon, 14 Sep 2020 00:22:31 -0700
Subject: [PATCH 03/52] Use primitive and remove unnecessary cast
---
.../java/com/aaronjwood/portauthority/network/Wireless.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/src/main/java/com/aaronjwood/portauthority/network/Wireless.java b/app/src/main/java/com/aaronjwood/portauthority/network/Wireless.java
index 8b4caf95..893ef3f3 100644
--- a/app/src/main/java/com/aaronjwood/portauthority/network/Wireless.java
+++ b/app/src/main/java/com/aaronjwood/portauthority/network/Wireless.java
@@ -189,7 +189,7 @@ public int getInternalWifiSubnet() throws NoWifiManagerException {
* @return Number of hosts as an integer.
*/
public int getNumberOfHostsInWifiSubnet() throws NoWifiManagerException {
- Double subnet = (double) getInternalWifiSubnet();
+ double subnet = getInternalWifiSubnet();
double hosts;
double bitsLeft = 32.0d - subnet;
hosts = Math.pow(2.0d, bitsLeft) - 2.0d;
From 1bcc274923417bd69c9cf8b93a9319f072d95475 Mon Sep 17 00:00:00 2001
From: Aaron Wood
Date: Mon, 14 Sep 2020 03:31:02 -0700
Subject: [PATCH 04/52] Display real progress when downloading databases
---
.../async/DownloadAsyncTask.java | 50 +++++++++++++------
.../async/DownloadOuisAsyncTask.java | 4 +-
2 files changed, 39 insertions(+), 15 deletions(-)
diff --git a/app/src/main/java/com/aaronjwood/portauthority/async/DownloadAsyncTask.java b/app/src/main/java/com/aaronjwood/portauthority/async/DownloadAsyncTask.java
index 1b2da869..6eafde3d 100644
--- a/app/src/main/java/com/aaronjwood/portauthority/async/DownloadAsyncTask.java
+++ b/app/src/main/java/com/aaronjwood/portauthority/async/DownloadAsyncTask.java
@@ -14,13 +14,21 @@
import java.io.InputStreamReader;
import java.lang.ref.WeakReference;
import java.net.URL;
-import java.nio.charset.StandardCharsets;
import java.util.zip.GZIPInputStream;
import javax.net.ssl.HttpsURLConnection;
-public abstract class DownloadAsyncTask extends AsyncTask {
+class DownloadProgress {
+ public String message;
+ public int progress;
+ @Override
+ public String toString() {
+ return message;
+ }
+}
+
+public abstract class DownloadAsyncTask extends AsyncTask {
private ProgressDialog dialog;
protected Database db;
@@ -40,7 +48,10 @@ protected void onPreExecute() {
Context ctx = (Context) activity;
dialog = new ProgressDialog(ctx, R.style.DialogTheme);
+ dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
dialog.setMessage(ctx.getResources().getString(R.string.downloadingData));
+ dialog.setIndeterminate(false);
+ dialog.setMax(100);
dialog.setCanceledOnTouchOutside(false);
dialog.setOnCancelListener(dialogInterface -> {
dialogInterface.cancel();
@@ -59,39 +70,51 @@ final void doInBackground(String service, Parser parser) {
BufferedReader in = null;
HttpsURLConnection connection = null;
db.beginTransaction();
+ DownloadProgress downProg = new DownloadProgress();
try {
URL url = new URL(service);
connection = (HttpsURLConnection) url.openConnection();
connection.setRequestProperty("Accept-Encoding", "gzip");
connection.connect();
if (connection.getResponseCode() != HttpsURLConnection.HTTP_OK) {
- publishProgress(connection.getResponseCode() + " " + connection.getResponseMessage());
+ downProg.message = connection.getResponseCode() + " " + connection.getResponseMessage();
+ publishProgress(downProg);
return;
}
+ // Get the content length ourselves since connection.getContentLengthLong() requires a minimum API of 24+.
+ // The same is true for connection.getHeaderFieldLong().
+ String contentLen = connection.getHeaderField("Content-Length");
+ long len = Long.parseLong(contentLen);
in = new BufferedReader(new InputStreamReader(new GZIPInputStream(connection.getInputStream()), "UTF-8"));
String line;
-
+ long total = 0;
while ((line = in.readLine()) != null) {
if (isCancelled()) {
return;
}
+ total += line.length(); // Lean on the fact that we're working with UTF-8 here.
+ downProg.progress = (int) (total * 100 / len);
+ publishProgress(downProg);
String[] data = parser.parseLine(line);
if (data == null) {
continue;
}
if (parser.saveLine(db, data) == -1) {
- publishProgress("Failed to insert data into the database. Please run this operation again");
+ downProg.message = "Failed to insert data into the database. Please run this operation again";
+ publishProgress(downProg);
return;
}
}
+
db.setTransactionSuccessful();
} catch (Exception e) {
- publishProgress(e.toString());
+ downProg.message = e.toString();
+ publishProgress(downProg);
} finally {
db.endTransaction();
try {
@@ -107,17 +130,16 @@ final void doInBackground(String service, Parser parser) {
}
}
- /**
- * Handles errors.
- *
- * @param progress
- */
@Override
- protected void onProgressUpdate(String... progress) {
+ protected void onProgressUpdate(DownloadProgress... progress) {
+ DownloadProgress currProg = progress[0];
MainAsyncResponse activity = delegate.get();
- if (activity != null) {
- activity.processFinish(new Exception(progress[0]));
+ if (currProg.message != null && activity != null) {
+ activity.processFinish(new Exception(currProg.message));
+ return;
}
+
+ dialog.setProgress(currProg.progress);
}
/**
diff --git a/app/src/main/java/com/aaronjwood/portauthority/async/DownloadOuisAsyncTask.java b/app/src/main/java/com/aaronjwood/portauthority/async/DownloadOuisAsyncTask.java
index 96d091bb..7db44806 100644
--- a/app/src/main/java/com/aaronjwood/portauthority/async/DownloadOuisAsyncTask.java
+++ b/app/src/main/java/com/aaronjwood/portauthority/async/DownloadOuisAsyncTask.java
@@ -9,7 +9,9 @@
public class DownloadOuisAsyncTask extends DownloadAsyncTask {
- private static final String SERVICE = "https://code.wireshark.org/review/gitweb?p=wireshark.git;a=blob_plain;f=manuf";
+ // The official source on gitlab.com doesn't provide a content length header which ruins our ability to report progress!
+ // Use the mirror from github.com instead.
+ private static final String SERVICE = "https://raw.githubusercontent.com/wireshark/wireshark/master/manuf";
/**
* Creates a new asynchronous task to handle downloading OUI data.
From f9d2453715a36b5a2efbe39c3d15b275e084002f Mon Sep 17 00:00:00 2001
From: Aaron Wood
Date: Mon, 14 Sep 2020 11:28:31 -0700
Subject: [PATCH 05/52] Allow sorting of discovered hosts by IP
---
.../portauthority/activity/MainActivity.java | 29 +++++++++++++------
.../async/ScanHostsAsyncTask.java | 10 ++++++-
.../portauthority/network/Host.java | 15 +++++++++-
app/src/main/res/menu/host_menu.xml | 3 ++
app/src/main/res/values/strings.xml | 1 +
5 files changed, 47 insertions(+), 11 deletions(-)
diff --git a/app/src/main/java/com/aaronjwood/portauthority/activity/MainActivity.java b/app/src/main/java/com/aaronjwood/portauthority/activity/MainActivity.java
index e7b25c0d..39db7822 100644
--- a/app/src/main/java/com/aaronjwood/portauthority/activity/MainActivity.java
+++ b/app/src/main/java/com/aaronjwood/portauthority/activity/MainActivity.java
@@ -58,7 +58,6 @@
import com.aaronjwood.portauthority.utils.UserPreference;
import java.io.IOException;
-import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.nio.ByteBuffer;
@@ -385,6 +384,23 @@ public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMen
public boolean onContextItemSelected(MenuItem item) {
AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
switch (item.getItemId()) {
+ case R.id.sortIp:
+ sortAscending = !sortAscending;
+ if (sortAscending) {
+ hostAdapter.sort((lhs, rhs) -> {
+ int leftIp = ByteBuffer.wrap(lhs.getAddress()).getInt();
+ int rightIp = ByteBuffer.wrap(rhs.getAddress()).getInt();
+ return rightIp - leftIp;
+ });
+ } else {
+ hostAdapter.sort((lhs, rhs) -> {
+ int leftIp = ByteBuffer.wrap(lhs.getAddress()).getInt();
+ int rightIp = ByteBuffer.wrap(rhs.getAddress()).getInt();
+ return leftIp - rightIp;
+ });
+ }
+
+ return true;
case R.id.sortHostname:
if (sortAscending) {
hostAdapter.sort((lhs, rhs) -> rhs.getHostname().toLowerCase().compareTo(lhs.getHostname().toLowerCase()));
@@ -745,14 +761,9 @@ public void processFinish(final Host h, final AtomicInteger i) {
scanHandler.post(() -> {
hosts.add(h);
hostAdapter.sort((lhs, rhs) -> {
- try {
- int leftIp = ByteBuffer.wrap(InetAddress.getByName(lhs.getIp()).getAddress()).getInt();
- int rightIp = ByteBuffer.wrap(InetAddress.getByName(rhs.getIp()).getAddress()).getInt();
-
- return leftIp - rightIp;
- } catch (UnknownHostException ignored) {
- return 0;
- }
+ int leftIp = ByteBuffer.wrap(lhs.getAddress()).getInt();
+ int rightIp = ByteBuffer.wrap(rhs.getAddress()).getInt();
+ return leftIp - rightIp;
});
discoverHostsBtn.setText(discoverHostsStr + " (" + hosts.size() + ")");
diff --git a/app/src/main/java/com/aaronjwood/portauthority/async/ScanHostsAsyncTask.java b/app/src/main/java/com/aaronjwood/portauthority/async/ScanHostsAsyncTask.java
index 499a394d..4fb07333 100644
--- a/app/src/main/java/com/aaronjwood/portauthority/async/ScanHostsAsyncTask.java
+++ b/app/src/main/java/com/aaronjwood/portauthority/async/ScanHostsAsyncTask.java
@@ -199,7 +199,15 @@ protected final void onProgressUpdate(Void... params) {
try {
host = new Host(ip, macAddress, db);
} catch (IOException e) {
- host = new Host(ip, macAddress);
+ try {
+ host = new Host(ip, macAddress);
+ } catch (UnknownHostException ex) {
+ if (activity != null) {
+ activity.processFinish(e);
+ }
+
+ return;
+ }
}
MainAsyncResponse activity1 = delegate.get();
diff --git a/app/src/main/java/com/aaronjwood/portauthority/network/Host.java b/app/src/main/java/com/aaronjwood/portauthority/network/Host.java
index fdd59922..fec98553 100644
--- a/app/src/main/java/com/aaronjwood/portauthority/network/Host.java
+++ b/app/src/main/java/com/aaronjwood/portauthority/network/Host.java
@@ -9,11 +9,14 @@
import java.io.IOException;
import java.io.Serializable;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
public class Host implements Serializable {
private String hostname;
private String ip;
+ private byte[] address;
private String mac;
private String vendor;
@@ -28,8 +31,9 @@ public Host(String ip, String mac, Database db) throws IOException {
* @param ip
* @param mac
*/
- public Host(String ip, String mac) {
+ public Host(String ip, String mac) throws UnknownHostException {
this.ip = ip;
+ this.address = InetAddress.getByName(ip).getAddress();
this.mac = mac;
}
@@ -78,6 +82,15 @@ public String getIp() {
return ip;
}
+ /**
+ * Returns this host's address in byte representation.
+ *
+ * @return
+ */
+ public byte[] getAddress() {
+ return this.address;
+ }
+
/**
* Returns this host's MAC address
*
diff --git a/app/src/main/res/menu/host_menu.xml b/app/src/main/res/menu/host_menu.xml
index 4495f927..0f9dbf31 100644
--- a/app/src/main/res/menu/host_menu.xml
+++ b/app/src/main/res/menu/host_menu.xml
@@ -5,6 +5,9 @@
android:id="@+id/sorting"
android:title="@string/sort">