diff --git a/client/android/Notifier/.idea/gradle.xml b/client/android/Notifier/.idea/gradle.xml index 7394c74d1c189ec6fa502d51a1cc846442715437..ad3290601eb70de70ea079048ac147b83b929ec7 100644 --- a/client/android/Notifier/.idea/gradle.xml +++ b/client/android/Notifier/.idea/gradle.xml @@ -1,5 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <project version="4"> + <component name="GradleMigrationSettings" migrationVersion="1" /> <component name="GradleSettings"> <option name="linkedExternalProjectsSettings"> <GradleProjectSettings> diff --git a/client/android/Notifier/app/src/main/AndroidManifest.xml b/client/android/Notifier/app/src/main/AndroidManifest.xml index aa1a9424c647011e9b5ef6798e31be735ab060bd..8e5f378d23115fc908f97c3ca23f47fbd49c9601 100644 --- a/client/android/Notifier/app/src/main/AndroidManifest.xml +++ b/client/android/Notifier/app/src/main/AndroidManifest.xml @@ -3,6 +3,8 @@ xmlns:tools="http://schemas.android.com/tools" package="com.mobilesec.client.notifier"> + <uses-permission android:name="android.permission.INTERNET"/> + <application android:allowBackup="true" android:dataExtractionRules="@xml/data_extraction_rules" diff --git a/client/android/Notifier/app/src/main/java/com/mobilesec/client/notifier/MainActivity.java b/client/android/Notifier/app/src/main/java/com/mobilesec/client/notifier/MainActivity.java index ce5bffa9968450976e40da474fe49e7477f46eae..fc7f649becb3cb2a3373cfc0351626303e3acb16 100644 --- a/client/android/Notifier/app/src/main/java/com/mobilesec/client/notifier/MainActivity.java +++ b/client/android/Notifier/app/src/main/java/com/mobilesec/client/notifier/MainActivity.java @@ -1,14 +1,12 @@ package com.mobilesec.client.notifier; -import static android.provider.Settings.ACTION_NOTIFICATION_LISTENER_SETTINGS; - import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.NotificationCompat; import androidx.core.app.NotificationManagerCompat; +import androidx.localbroadcastmanager.content.LocalBroadcastManager; import android.app.NotificationChannel; import android.app.NotificationManager; -import android.content.Intent; import android.content.IntentFilter; import android.os.Build; import android.os.Bundle; @@ -29,12 +27,10 @@ public class MainActivity extends AppCompatActivity { // Register notification receiver br = new NotificationBroadcastReceiver(); IntentFilter intentFilter = new IntentFilter(); - intentFilter.addAction("com.mobilesec.client.notifier"); - registerReceiver(br,intentFilter); + intentFilter.addAction("com.mobilesec.client.notifier.NotifierService"); + LocalBroadcastManager.getInstance(this).registerReceiver(br, intentFilter); createNotificationChannel(); - - startActivity(new Intent(ACTION_NOTIFICATION_LISTENER_SETTINGS)); } private void createNotificationChannel() { @@ -42,8 +38,8 @@ public class MainActivity extends AppCompatActivity { // the NotificationChannel class is new and not in the support library if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { // TODO: Better name and description; move to resources? - CharSequence name = "notifierChannel";//getString(R.string.channel_name); - String description = "Notification channel for Notifier app."; //getString(R.string.channel_description); + CharSequence name = "notifierChannel"; + String description = "Notification channel for Notifier app."; int importance = NotificationManager.IMPORTANCE_DEFAULT; NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance); channel.setDescription(description); diff --git a/client/android/Notifier/app/src/main/java/com/mobilesec/client/notifier/NotificationBroadcastReceiver.java b/client/android/Notifier/app/src/main/java/com/mobilesec/client/notifier/NotificationBroadcastReceiver.java index dbaefd036fa53c8fe72131822c74486503008351..8cb893a9b63c4a302a8ca9d9ac67679049d8bf0e 100644 --- a/client/android/Notifier/app/src/main/java/com/mobilesec/client/notifier/NotificationBroadcastReceiver.java +++ b/client/android/Notifier/app/src/main/java/com/mobilesec/client/notifier/NotificationBroadcastReceiver.java @@ -1,15 +1,53 @@ package com.mobilesec.client.notifier; +import android.app.Notification; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; +import android.os.Bundle; import android.util.Log; +import io.grpc.ManagedChannel; +import io.grpc.ManagedChannelBuilder; +import io.grpc.notifier.Nothing; +import io.grpc.notifier.NotifierComGrpc; +import io.grpc.notifier.SendMessageRequest; +import io.grpc.stub.StreamObserver; + public class NotificationBroadcastReceiver extends BroadcastReceiver { + private ManagedChannel channel; + private final NotifierComGrpc.NotifierComStub asyncStub; + + public NotificationBroadcastReceiver() { + channel = ManagedChannelBuilder.forAddress("192.168.0.127", 8080).usePlaintext().build(); + Log.i("NOTIFIER[NotificationBroadcastReceiver]", String.format("ConnectivityState: %s", channel.getState(true).name())); + asyncStub = NotifierComGrpc.newStub(channel); + } + @Override public void onReceive(Context context, Intent intent) { Log.i("NOTIFIER[onReceive]", "Received notification."); - // TODO: Upload to server here + Bundle notification = intent.getBundleExtra("Notification"); + String m = notification.getCharSequence(Notification.EXTRA_TEXT).toString(); + SendMessageRequest message = SendMessageRequest.newBuilder().setMessage(m).build(); + asyncStub.sendMessage(message, new StreamObserver<Nothing>() { + @Override + public void onNext(Nothing value) { + + } + + @Override + public void onError(Throwable t) { + Log.w("NOTIFIER[onReceive]", t); + Log.i("NOTIFIER[NotificationBroadcastReceiver]", String.format("ConnectivityState: %s", channel.getState(true).name())); + Log.w("NOTIFIER[onReceive]", "Failed to send message."); + } + + @Override + public void onCompleted() { + Log.i("NOTIFIER[onReceive]", "Completed sendMessage."); + } + }); } } diff --git a/client/android/Notifier/app/src/main/java/com/mobilesec/client/notifier/NotifierService.java b/client/android/Notifier/app/src/main/java/com/mobilesec/client/notifier/NotifierService.java index 4caadab75973d129b77d144d05e877339f906a24..556c9523af3bc66eafa6795e59b8389353f9f5bc 100644 --- a/client/android/Notifier/app/src/main/java/com/mobilesec/client/notifier/NotifierService.java +++ b/client/android/Notifier/app/src/main/java/com/mobilesec/client/notifier/NotifierService.java @@ -7,19 +7,19 @@ import android.service.notification.NotificationListenerService; import android.service.notification.StatusBarNotification; import android.util.Log; +import androidx.localbroadcastmanager.content.LocalBroadcastManager; + // SEE https://developer.android.com/training/notify-user/build-notification public class NotifierService extends NotificationListenerService { - public NotifierService() { - } @Override public void onNotificationPosted(StatusBarNotification sbn) { Bundle b = sbn.getNotification().extras; Log.i("NOTIFIER[NotificationListenerService.onNotificationPosted]", - "ID :" + sbn.getId() + "|" + b.getCharSequence(Notification.EXTRA_TITLE) + "|" + b.getCharSequence(Notification.EXTRA_TEXT) + "|" + sbn.getPackageName()); - Intent intent = new Intent("com.mobilesec.client.notifier.NotifierService"); - intent.putExtra("Notification Code", sbn.getNotification().extras); - sendBroadcast(intent); + String.format("[%s]:[%d]: %s | %s", sbn.getPackageName(), sbn.getId(), b.getCharSequence(Notification.EXTRA_TITLE), b.getCharSequence(Notification.EXTRA_TEXT))); + Intent intent = new Intent("com.mobilesec.client.notifier.NotifierService"); + intent.putExtra("Notification", sbn.getNotification().extras); + LocalBroadcastManager.getInstance(this).sendBroadcast(intent); } } \ No newline at end of file diff --git a/server/server.py b/server/server.py index 25fb0e2bc4a53325afe9b358d15907d0b0a42be3..072bee804da43af19ff0bf3d5acba171794b8d66 100644 --- a/server/server.py +++ b/server/server.py @@ -1,8 +1,12 @@ +import sys +sys.path.insert(0, '..') +sys.path.insert(0, '../shared/netcode') + import grpc from concurrent import futures -from netcode.netcode_pb2_grpc import * -from netcode.netcode_pb2 import * +from shared.netcode.netcode_pb2_grpc import * +from shared.netcode.netcode_pb2 import * class NotifierService(NotifierComServicer): def SendMessage(self, request, context): @@ -12,7 +16,7 @@ class NotifierService(NotifierComServicer): if __name__ == "__main__": server = grpc.server(futures.ThreadPoolExecutor(max_workers=10)) add_NotifierComServicer_to_server( - NotifierService, server) + NotifierService(), server) server.add_insecure_port('[::]:8080') server.start() server.wait_for_termination()