diff --git a/agent/src/main/AndroidManifest.xml b/agent/src/main/AndroidManifest.xml index 4232510..3e1afaa 100644 --- a/agent/src/main/AndroidManifest.xml +++ b/agent/src/main/AndroidManifest.xml @@ -1,17 +1,19 @@ + android:versionName="3.1.1" > + + android:theme="@style/AppTheme" + android:name=".DzApplication"> diff --git a/agent/src/main/java/com/WithSecure/dz/DzApplication.java b/agent/src/main/java/com/WithSecure/dz/DzApplication.java new file mode 100644 index 0000000..0ee65f0 --- /dev/null +++ b/agent/src/main/java/com/WithSecure/dz/DzApplication.java @@ -0,0 +1,17 @@ +package com.WithSecure.dz; + +import android.app.Application; + +import com.WithSecure.dz.models.ForegroundServiceNotification; +import com.WithSecure.dz.models.GlobalSettings; + +public class DzApplication extends Application { + @Override + public void onCreate() { + super.onCreate(); + + ForegroundServiceNotification.Init(this.getApplicationContext()); + Agent.getInstance().setContext(this.getApplicationContext()); + GlobalSettings.Init(this.getApplicationContext()); + } +} diff --git a/agent/src/main/java/com/WithSecure/dz/activities/AboutActivity.java b/agent/src/main/java/com/WithSecure/dz/activities/AboutActivity.java index 9936462..a83e5cf 100644 --- a/agent/src/main/java/com/WithSecure/dz/activities/AboutActivity.java +++ b/agent/src/main/java/com/WithSecure/dz/activities/AboutActivity.java @@ -8,7 +8,7 @@ import android.view.Menu; import android.widget.TextView; -public class AboutActivity extends Activity { +public class AboutActivity extends BaseActivity { private TextView description; @@ -22,7 +22,7 @@ private String getVersionName() { } @Override - protected void onCreate(Bundle savedInstanceState) { + public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_about); diff --git a/agent/src/main/java/com/WithSecure/dz/activities/BaseActivity.java b/agent/src/main/java/com/WithSecure/dz/activities/BaseActivity.java new file mode 100644 index 0000000..a8ebab0 --- /dev/null +++ b/agent/src/main/java/com/WithSecure/dz/activities/BaseActivity.java @@ -0,0 +1,16 @@ +package com.WithSecure.dz.activities; + +import android.app.Activity; +import android.os.Bundle; + +import com.WithSecure.dz.models.GlobalSettings; + +public class BaseActivity extends Activity { + @Override + public void onCreate(Bundle savedInstanceState) { + setTheme(GlobalSettings.themeFromString(GlobalSettings.get("theme"))); + + super.onCreate(savedInstanceState); + } +} + diff --git a/agent/src/main/java/com/WithSecure/dz/activities/BasePreferenceActivity.java b/agent/src/main/java/com/WithSecure/dz/activities/BasePreferenceActivity.java new file mode 100644 index 0000000..962841b --- /dev/null +++ b/agent/src/main/java/com/WithSecure/dz/activities/BasePreferenceActivity.java @@ -0,0 +1,16 @@ +package com.WithSecure.dz.activities; + +import android.os.Bundle; +import android.preference.PreferenceActivity; + +import com.WithSecure.dz.models.GlobalSettings; + +public class BasePreferenceActivity extends PreferenceActivity { + @Override + @SuppressWarnings("deprecation") + public void onCreate(Bundle savedInstanceState) { + setTheme(GlobalSettings.themeFromString(GlobalSettings.get("theme"))); + + super.onCreate(savedInstanceState); + } +} diff --git a/agent/src/main/java/com/WithSecure/dz/activities/ConnectorActivity.java b/agent/src/main/java/com/WithSecure/dz/activities/ConnectorActivity.java index 8208df0..cb1e8a9 100644 --- a/agent/src/main/java/com/WithSecure/dz/activities/ConnectorActivity.java +++ b/agent/src/main/java/com/WithSecure/dz/activities/ConnectorActivity.java @@ -17,7 +17,7 @@ import android.view.Menu; import android.view.MenuItem; -public abstract class ConnectorActivity extends Activity { +public abstract class ConnectorActivity extends BaseActivity { public static class IncomingFingerprintHandler extends Handler { diff --git a/agent/src/main/java/com/WithSecure/dz/activities/EndpointSettingsActivity.java b/agent/src/main/java/com/WithSecure/dz/activities/EndpointSettingsActivity.java index 4ddb120..aa31992 100644 --- a/agent/src/main/java/com/WithSecure/dz/activities/EndpointSettingsActivity.java +++ b/agent/src/main/java/com/WithSecure/dz/activities/EndpointSettingsActivity.java @@ -17,7 +17,7 @@ import android.view.View; import android.widget.Button; -public class EndpointSettingsActivity extends PreferenceActivity { +public class EndpointSettingsActivity extends BasePreferenceActivity { public static final String ENDPOINT_SETTINGS_PREFERENCE = "endpoint_settings"; public static final String SECURITY_SETTINGS_PREFERENCE = "security_settings"; diff --git a/agent/src/main/java/com/WithSecure/dz/activities/MainActivity.java b/agent/src/main/java/com/WithSecure/dz/activities/MainActivity.java index 811ba99..beb4cf3 100644 --- a/agent/src/main/java/com/WithSecure/dz/activities/MainActivity.java +++ b/agent/src/main/java/com/WithSecure/dz/activities/MainActivity.java @@ -7,16 +7,29 @@ import com.WithSecure.dz.views.ServerListRowView; import com.WithSecure.jsolar.api.connectors.Endpoint; +import android.Manifest; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.net.Uri; +import android.os.Build; import android.os.Bundle; import android.os.RemoteException; import android.app.Activity; import android.content.Intent; +import android.provider.Settings; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Toast; -public class MainActivity extends Activity { +import androidx.core.app.ActivityCompat; +import androidx.core.content.ContextCompat; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class MainActivity extends BaseActivity { private EndpointListView endpoint_list_view = null; private ServerListRowView server_list_row_view = null; @@ -36,8 +49,6 @@ private void launchServerActivity() { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - Agent.getInstance().setContext(this.getApplicationContext()); - setContentView(R.layout.activity_main); this.endpoint_list_view = (EndpointListView)this.findViewById(R.id.endpoint_list_view); @@ -80,6 +91,36 @@ public void onToggle(boolean toggle) { } }); + + // request all unrequested perms in manifest + try { + PackageInfo pi = getPackageManager().getPackageInfo(getApplicationContext().getPackageName(), PackageManager.GET_PERMISSIONS); + String[] requestedPermissions = pi.requestedPermissions; + + List toRequest = new ArrayList<>(); + for (String p : requestedPermissions) { + if (ContextCompat.checkSelfPermission(getApplicationContext(), p) != PackageManager.PERMISSION_GRANTED) { + if (p.equals(Manifest.permission.SYSTEM_ALERT_WINDOW)) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !Settings.canDrawOverlays(this)) { + Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, + Uri.parse("package:" + getPackageName())); + startActivity(intent); + } + } + else { + toRequest.add(p); + } + } + } + + if (!toRequest.isEmpty()) { + String[] asArray = new String[toRequest.size()]; + toRequest.toArray(asArray); + ActivityCompat.requestPermissions(this, asArray, 1); + } + } catch (PackageManager.NameNotFoundException e) { + throw new RuntimeException(e); + } } @Override diff --git a/agent/src/main/java/com/WithSecure/dz/activities/ServerActivity.java b/agent/src/main/java/com/WithSecure/dz/activities/ServerActivity.java index fbc13ff..5af8093 100644 --- a/agent/src/main/java/com/WithSecure/dz/activities/ServerActivity.java +++ b/agent/src/main/java/com/WithSecure/dz/activities/ServerActivity.java @@ -1,12 +1,17 @@ package com.WithSecure.dz.activities; +import java.util.ArrayList; +import java.util.List; import java.util.Observable; import java.util.Observer; import com.WithSecure.dz.Agent; import com.WithSecure.dz.R; +import com.WithSecure.dz.models.NetworkInterfaceModel; +import com.WithSecure.dz.models.ServerSettings; import com.WithSecure.dz.views.CheckListItemView; import com.WithSecure.dz.views.ConnectorStatusIndicator; +import com.WithSecure.dz.views.NetworkInterfaceListAdapter; import com.WithSecure.dz.views.logger.LogMessageAdapter; import com.WithSecure.jsolar.api.connectors.Connector; import com.WithSecure.jsolar.api.connectors.Endpoint; @@ -28,6 +33,10 @@ public class ServerActivity extends ConnectorActivity implements Observer, Serve private CompoundButton server_enabled = null; private ListView server_messages = null; private ConnectorStatusIndicator server_status_indicator = null; + + private ListView server_interface_list = null; + private NetworkInterfaceListAdapter server_interface_adapter = null; + private List server_interface_data; private CheckListItemView status_enabled = null; private CheckListItemView status_listening = null; @@ -51,9 +60,18 @@ public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.setContentView(R.layout.activity_server); - - this.server_status_indicator = (ConnectorStatusIndicator)this.findViewById(R.id.server_status_indicator); - + + this.server_status_indicator = (ConnectorStatusIndicator)this.findViewById(R.id.server_status_indicator); + + this.server_interface_list = (ListView)this.findViewById(R.id.server_endpoint); + this.server_interface_data = new ArrayList<>(); + this.server_interface_adapter = new NetworkInterfaceListAdapter(this, server_interface_data); + server_interface_list.setAdapter(server_interface_adapter); + + server_interface_adapter.clear(); + server_interface_adapter.addAll(ServerSettings.getInterfaces()); + server_interface_adapter.notifyDataSetChanged(); + this.server_enabled = (CompoundButton)this.findViewById(R.id.server_enabled); this.server_enabled.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @@ -99,6 +117,9 @@ public void onDetailedStatus(Bundle status) { * Refresh the status indicators, to show the current status of the Endpoint. */ protected void refreshStatus() { + server_interface_adapter.clear(); + server_interface_adapter.addAll(ServerSettings.getInterfaces()); + server_interface_adapter.notifyDataSetChanged(); this.getDetailedServerStatus(); } diff --git a/agent/src/main/java/com/WithSecure/dz/activities/SettingsActivity.java b/agent/src/main/java/com/WithSecure/dz/activities/SettingsActivity.java index cab20d6..9edf64b 100644 --- a/agent/src/main/java/com/WithSecure/dz/activities/SettingsActivity.java +++ b/agent/src/main/java/com/WithSecure/dz/activities/SettingsActivity.java @@ -14,7 +14,7 @@ import android.preference.PreferenceCategory; import android.widget.Toast; -public class SettingsActivity extends PreferenceActivity { +public class SettingsActivity extends BasePreferenceActivity { public static final String ABOUT_DROZER_PREFERENCE = "about_drozer"; public static final String ENDPOINT_SETTINGS_PREFERENCE = "endpoint_settings"; diff --git a/agent/src/main/java/com/WithSecure/dz/activities/StartBroadcastActivity.java b/agent/src/main/java/com/WithSecure/dz/activities/StartBroadcastActivity.java index 00d3d43..43ae7c3 100644 --- a/agent/src/main/java/com/WithSecure/dz/activities/StartBroadcastActivity.java +++ b/agent/src/main/java/com/WithSecure/dz/activities/StartBroadcastActivity.java @@ -9,7 +9,7 @@ import java.util.ArrayList; -public class StartBroadcastActivity extends Activity { +public class StartBroadcastActivity extends BaseActivity { public void onCreate(Bundle bundle) { super.onCreate(bundle); diff --git a/agent/src/main/java/com/WithSecure/dz/helpers/IntentProxyToContentProvider.java b/agent/src/main/java/com/WithSecure/dz/helpers/IntentProxyToContentProvider.java index 3841fa6..f98060d 100644 --- a/agent/src/main/java/com/WithSecure/dz/helpers/IntentProxyToContentProvider.java +++ b/agent/src/main/java/com/WithSecure/dz/helpers/IntentProxyToContentProvider.java @@ -1,15 +1,16 @@ package com.WithSecure.dz.helpers; -import android.app.Activity; import android.net.Uri; import android.os.Bundle; +import com.WithSecure.dz.activities.BaseActivity; + import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.InputStream; -public class IntentProxyToContentProvider extends Activity { +public class IntentProxyToContentProvider extends BaseActivity { // This class is meant to help download files from unexported Content Providers // Assuming the unexported Content Provider has GrantURIPermissions set to True @@ -27,7 +28,7 @@ public class IntentProxyToContentProvider extends Activity { String filename = "yayoutputyay"; // save file as "yayoutputyay" - protected void onCreate(Bundle savedInstanceState) { + public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Uri uri = Uri.parse(getIntent().getDataString()); // Get the Uri for the unexported content provider if (getIntent().getStringExtra("filename") != null) { diff --git a/agent/src/main/java/com/WithSecure/dz/models/ForegroundServiceNotification.java b/agent/src/main/java/com/WithSecure/dz/models/ForegroundServiceNotification.java new file mode 100644 index 0000000..f37264b --- /dev/null +++ b/agent/src/main/java/com/WithSecure/dz/models/ForegroundServiceNotification.java @@ -0,0 +1,62 @@ +package com.WithSecure.dz.models; + +import android.app.Notification; +import android.app.NotificationChannel; +import android.app.NotificationManager; +import android.app.PendingIntent; +import android.content.Context; +import android.content.Intent; +import android.os.Build; + +import androidx.core.app.NotificationCompat; + +import com.WithSecure.dz.R; +import com.WithSecure.dz.activities.MainActivity; + +public class ForegroundServiceNotification { + private static final String CHANNEL_ID = "ForegroundServiceChannel"; + private static final int NOTIFICATION_ID = 1; + + private Notification notification; + private static ForegroundServiceNotification instance = null; + + private ForegroundServiceNotification(Context ctx) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + NotificationChannel channel = new NotificationChannel( + CHANNEL_ID, + "Foreground Service Channel", + NotificationManager.IMPORTANCE_HIGH + ); + channel.setDescription("Channel for foreground service"); + + NotificationManager manager = ctx.getSystemService(NotificationManager.class); + if (manager != null) { + manager.createNotificationChannel(channel); + } + + Intent notificationIntent = new Intent(ctx, MainActivity.class); + PendingIntent pendingIntent = PendingIntent.getActivity(ctx, 0, notificationIntent, PendingIntent.FLAG_IMMUTABLE); + + notification = new NotificationCompat.Builder(ctx, CHANNEL_ID) + .setContentTitle("Drozer") + .setContentText("Drozer is running in background") + .setSmallIcon(R.drawable.ic_notification) + .setContentIntent(pendingIntent) + .build(); + } + } + + public static void Init(Context ctx) { + if (instance == null) { + instance = new ForegroundServiceNotification(ctx); + } + } + + public static Notification getNotification() { + return instance.notification; + } + + public static int getId() { + return NOTIFICATION_ID; + } +} diff --git a/agent/src/main/java/com/WithSecure/dz/models/GlobalSettings.java b/agent/src/main/java/com/WithSecure/dz/models/GlobalSettings.java new file mode 100644 index 0000000..9e8449a --- /dev/null +++ b/agent/src/main/java/com/WithSecure/dz/models/GlobalSettings.java @@ -0,0 +1,90 @@ +package com.WithSecure.dz.models; +import android.content.Context; +import android.content.SharedPreferences; +import android.content.res.Resources; +import com.WithSecure.dz.Agent; +import com.WithSecure.dz.R; +import com.WithSecure.jsolar.api.connectors.Server; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.Dictionary; +import java.util.Hashtable; + +public class GlobalSettings { + private GlobalSettings(Context ctx) { + // skip if config loading is disabled + if (Agent.getInstance().getSettings().getBoolean("disable_config_loading", false)) + return; + + // load settings from config file + try { + BufferedReader confFile = new BufferedReader(new InputStreamReader( + ctx.getResources().openRawResource(R.raw.config))); + String line; + + while ((line = confFile.readLine()) != null) { + String[] parts = line.split(":", 2); + + if (parts.length != 2) { + continue; + } + + data.put(parts[0], parts[1]); + + // preform additional changes on a per setting basis + switch (parts[0]) { + case "server-port": + try { + SharedPreferences.Editor e = Agent.getInstance().getSettings().edit(); + e.putString(Server.SERVER_PORT, parts[1]); + e.commit(); + } + catch (NumberFormatException ignored) { + break; + } + break; + default: + break; + } + } + } + catch (Resources.NotFoundException ignored) { } + catch (IOException ignored) { } + } + + public static String get(String key) { + return get(key, null); + } + + public static String get(String key, String fallback) { + String value = instance.data.get(key); + + return value != null + ? value + : fallback; + } + + public static int themeFromString(String s) { + if (s == null) { + return R.style.AppTheme; + } + + switch(s) { + case "red": return R.style.dzRed; + case "green": return R.style.dzGreen; + case "purple": return R.style.dzPurple; + case "blue": return R.style.dzBlue; + default: return R.style.AppTheme; + } + } + + public static void Init(Context ctx) { + if (instance == null) { + instance = new GlobalSettings(ctx); + } + } + + private static GlobalSettings instance = null; + private final Dictionary data = new Hashtable<>(); +} diff --git a/agent/src/main/java/com/WithSecure/dz/models/NetworkInterfaceModel.java b/agent/src/main/java/com/WithSecure/dz/models/NetworkInterfaceModel.java new file mode 100644 index 0000000..3770713 --- /dev/null +++ b/agent/src/main/java/com/WithSecure/dz/models/NetworkInterfaceModel.java @@ -0,0 +1,16 @@ +package com.WithSecure.dz.models; + + +import java.util.List; + +public class NetworkInterfaceModel +{ + public NetworkInterfaceModel(String name, List ips) + { + this.name = name; + this.ips = ips; + } + + public final String name; + public final List ips; +} \ No newline at end of file diff --git a/agent/src/main/java/com/WithSecure/dz/models/ServerSettings.java b/agent/src/main/java/com/WithSecure/dz/models/ServerSettings.java index beb5944..e2e3aa8 100644 --- a/agent/src/main/java/com/WithSecure/dz/models/ServerSettings.java +++ b/agent/src/main/java/com/WithSecure/dz/models/ServerSettings.java @@ -6,6 +6,12 @@ import com.WithSecure.dz.Agent; import com.WithSecure.jsolar.api.connectors.Server; +import java.net.InetAddress; +import java.net.NetworkInterface; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.List; + public class ServerSettings implements OnSharedPreferenceChangeListener { private Server server; @@ -56,21 +62,21 @@ public void load(Server server) { this.getSettings().registerOnSharedPreferenceChangeListener(this); } - + @Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { if(key.equals(Server.SERVER_PORT)) this.server.setPort(this.getPort()); if(key.equals(Server.SERVER_PASSWORD)) this.server.setPassword(this.getPassword()); - + if(key.equals(Server.SERVER_SSL)) { this.server.setSSL(this.isSSL()); server.setKeyStorePath(this.getKeyStorePath()); server.setKeyStorePassword(this.getKeyStorePassword()); server.setKeyPassword(this.getKeyPassword()); } - + if(key.equals(Server.SERVER_KEYSTORE_PATH)) server.setKeyStorePath(this.getKeyStorePath()); if(key.equals(Server.SERVER_KEYSTORE_PASSWORD)) @@ -78,7 +84,7 @@ public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, Strin if(key.equals(Server.SERVER_KEY_PASSWORD)) server.setKeyPassword(this.getKeyPassword()); } - + public boolean save(Server server) { SharedPreferences.Editor editor = Agent.getInstance().getSettings().edit(); @@ -88,4 +94,39 @@ public boolean save(Server server) { return editor.commit(); } + public static List getInterfaces() { + List ret = new ArrayList<>(); + try { + List ipAddrs = new ArrayList<>(); + + Enumeration interfaces = NetworkInterface.getNetworkInterfaces(); + while (interfaces.hasMoreElements()) { + NetworkInterface intr = interfaces.nextElement(); + + if (!intr.isUp()) { + continue; + } + + NetworkInterfaceModel inter_data = new NetworkInterfaceModel(intr.getName(), new ArrayList<>()); + + Enumeration ips = intr.getInetAddresses(); + while (ips.hasMoreElements()) { + InetAddress ip = ips.nextElement(); + + if (ip.isLinkLocalAddress()) { + continue; + } + + inter_data.ips.add(ip.getHostAddress()); + } + + if (!inter_data.ips.isEmpty()) + { + ret.add(inter_data); + } + } + } catch (Exception ignored) { } + return ret; + } + } diff --git a/agent/src/main/java/com/WithSecure/dz/services/ClientService.java b/agent/src/main/java/com/WithSecure/dz/services/ClientService.java index 2d1477d..e1cfa0c 100644 --- a/agent/src/main/java/com/WithSecure/dz/services/ClientService.java +++ b/agent/src/main/java/com/WithSecure/dz/services/ClientService.java @@ -222,7 +222,7 @@ public void onDestroy() { public static void startAndBindToService(Context context, ServiceConnection serviceConnection) { if(!ClientService.running) - context.startService(new Intent(context, ClientService.class)); + ConnectorService.Start(context, ClientService.class); Intent intent = new Intent(context, ClientService.class); context.bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE); diff --git a/agent/src/main/java/com/WithSecure/dz/services/ConnectorService.java b/agent/src/main/java/com/WithSecure/dz/services/ConnectorService.java index a57ff67..38862a0 100644 --- a/agent/src/main/java/com/WithSecure/dz/services/ConnectorService.java +++ b/agent/src/main/java/com/WithSecure/dz/services/ConnectorService.java @@ -3,14 +3,19 @@ import java.lang.ref.WeakReference; import java.util.ArrayList; +import com.WithSecure.dz.Agent; +import com.WithSecure.dz.models.ForegroundServiceNotification; import com.WithSecure.jsolar.api.connectors.Connector; import com.WithSecure.jsolar.api.connectors.Endpoint; import com.WithSecure.jsolar.logger.LogMessage; import com.WithSecure.jsolar.logger.Logger; import com.WithSecure.jsolar.logger.OnLogMessageListener; +import android.Manifest; import android.app.Service; +import android.content.Context; import android.content.Intent; +import android.content.pm.PackageManager; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; @@ -18,6 +23,8 @@ import android.os.Messenger; import android.os.RemoteException; +import androidx.core.content.ContextCompat; + public abstract class ConnectorService extends Service implements OnLogMessageListener { public static final int MSG_LOG_MESSAGE = 1; @@ -84,7 +91,16 @@ public void cacheMessenger(Messenger messenger) { public IBinder onBind(Intent intent) { return this.messenger.getBinder(); } - + + @Override + public void onCreate() { + super.onCreate(); + + if (ContextCompat.checkSelfPermission(Agent.getContext(), Manifest.permission.FOREGROUND_SERVICE) + == PackageManager.PERMISSION_GRANTED) + startForeground(ForegroundServiceNotification.getId(), ForegroundServiceNotification.getNotification()); + } + @Override public void onLogMessage(Logger logger, LogMessage message) { Bundle data = new Bundle(); @@ -115,4 +131,14 @@ protected void sendToAllMessengers(Message msg) { } } + public static void Start(Context ctx, Class c) { + Intent i = new Intent(ctx, c); + + if (ContextCompat.checkSelfPermission(ctx, Manifest.permission.FOREGROUND_SERVICE) + == PackageManager.PERMISSION_GRANTED) + ContextCompat.startForegroundService(ctx, new Intent(ctx, c)); + else + ctx.startService(i); + } + } diff --git a/agent/src/main/java/com/WithSecure/dz/services/ServerService.java b/agent/src/main/java/com/WithSecure/dz/services/ServerService.java index 18fa8f4..f44e705 100644 --- a/agent/src/main/java/com/WithSecure/dz/services/ServerService.java +++ b/agent/src/main/java/com/WithSecure/dz/services/ServerService.java @@ -193,7 +193,7 @@ public void onDestroy() { public static void startAndBindToService(Context context, ServiceConnection serviceConnection) { if(!ServerService.running) - context.startService(new Intent(context, ServerService.class)); + ConnectorService.Start(context, ServerService.class); Intent intent = new Intent(context, ServerService.class); context.bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE); diff --git a/agent/src/main/java/com/WithSecure/dz/views/NetworkInterfaceListAdapter.java b/agent/src/main/java/com/WithSecure/dz/views/NetworkInterfaceListAdapter.java new file mode 100644 index 0000000..c5f1e0c --- /dev/null +++ b/agent/src/main/java/com/WithSecure/dz/views/NetworkInterfaceListAdapter.java @@ -0,0 +1,45 @@ +package com.WithSecure.dz.views; + +import android.app.Activity; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.TextView; + +import androidx.annotation.NonNull; + +import com.WithSecure.dz.R; +import com.WithSecure.dz.models.NetworkInterfaceModel; + +import java.util.List; + +public class NetworkInterfaceListAdapter extends ArrayAdapter +{ + private final Activity context; + + public NetworkInterfaceListAdapter(@NonNull Activity context, List interfaces) { + super(context, R.layout.list_view_network_interface, interfaces); + + this.context = context; + } + + @NonNull + @Override + public View getView(int position, View view, @NonNull ViewGroup parent) + { + LayoutInflater inflater=this.context.getLayoutInflater(); + View rowView=inflater.inflate(R.layout.list_view_network_interface, null,true); + + TextView name = rowView.findViewById(R.id.interface_name); + TextView ips = rowView.findViewById(R.id.ips); + + NetworkInterfaceModel data = this.getItem(position); + assert data != null; + + name.setText(data.name); + ips.setText(String.join("\n", data.ips)); + + return rowView; + } +} \ No newline at end of file diff --git a/agent/src/main/res/drawable/background_blue.xml b/agent/src/main/res/drawable/background_blue.xml new file mode 100644 index 0000000..b11dff5 --- /dev/null +++ b/agent/src/main/res/drawable/background_blue.xml @@ -0,0 +1,13 @@ + + + + + + + + + \ No newline at end of file diff --git a/agent/src/main/res/drawable/background_green.xml b/agent/src/main/res/drawable/background_green.xml new file mode 100644 index 0000000..83e98c9 --- /dev/null +++ b/agent/src/main/res/drawable/background_green.xml @@ -0,0 +1,13 @@ + + + + + + + + + \ No newline at end of file diff --git a/agent/src/main/res/drawable/background_purple.xml b/agent/src/main/res/drawable/background_purple.xml new file mode 100644 index 0000000..f40f9c9 --- /dev/null +++ b/agent/src/main/res/drawable/background_purple.xml @@ -0,0 +1,13 @@ + + + + + + + + + \ No newline at end of file diff --git a/agent/src/main/res/drawable/background_red.xml b/agent/src/main/res/drawable/background_red.xml new file mode 100644 index 0000000..48e229e --- /dev/null +++ b/agent/src/main/res/drawable/background_red.xml @@ -0,0 +1,12 @@ + + + + + + + + \ No newline at end of file diff --git a/agent/src/main/res/layout/activity_server.xml b/agent/src/main/res/layout/activity_server.xml index 38a0b18..41f5574 100644 --- a/agent/src/main/res/layout/activity_server.xml +++ b/agent/src/main/res/layout/activity_server.xml @@ -27,12 +27,28 @@ android:paddingTop="24dp" android:text="@string/embedded_server_details" android:textAppearance="?android:attr/textAppearanceLarge" /> + + + + + + + + \ No newline at end of file diff --git a/agent/src/main/res/raw/config.txt b/agent/src/main/res/raw/config.txt new file mode 100644 index 0000000..e69de29 diff --git a/agent/src/main/res/values-v14/styles.xml b/agent/src/main/res/values-v14/styles.xml index 3da2d61..1c4959c 100644 --- a/agent/src/main/res/values-v14/styles.xml +++ b/agent/src/main/res/values-v14/styles.xml @@ -1,5 +1,21 @@ + - + + + + + + \ No newline at end of file diff --git a/agent/src/main/res/values/strings.xml b/agent/src/main/res/values/strings.xml index 453fd40..8dda6d5 100644 --- a/agent/src/main/res/values/strings.xml +++ b/agent/src/main/res/values/strings.xml @@ -30,6 +30,7 @@ Embedded Server Server Details + Server Interfaces: Messages Password Password Protected @@ -124,5 +125,7 @@ drozer Settings Restore after crash Restore state after an unexpected shutdown + Disable config file loading + Disable auto loading of custom agent settings diff --git a/agent/src/main/res/xml/preferences.xml b/agent/src/main/res/xml/preferences.xml index cf09232..cfd7570 100644 --- a/agent/src/main/res/xml/preferences.xml +++ b/agent/src/main/res/xml/preferences.xml @@ -64,6 +64,10 @@ android:title="@string/restore_after_crash" android:summary="@string/restore_summary" android:defaultValue="true"/> +