Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 756a1176 authored by Joseph Pirozzo's avatar Joseph Pirozzo
Browse files

MapClient parse bad messages

Improve error handling for cases where messages don't have the expected
sender/originator, and messages from the owner to themselves.

Bug: 181684648
Bug: 181693111
Bug: 181696727
Bug: 181697508
Bug: 181787298
Test: atest BluetoothInstrumentationTests
Tag: #stability
Change-Id: Id251d9a899b8e8faef69dbb9bb06a3ba6669692e
parent ecf3381a
Loading
Loading
Loading
Loading
+51 −13
Original line number Diff line number Diff line
@@ -96,7 +96,7 @@ class MapClientContent {
        mSubscriptionManager = (SubscriptionManager) mContext
                .getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE);
        mSubscriptionManager
                .addSubscriptionInfoRecord(device.getAddress(), /*device.getName()*/"TEST", 0,
                .addSubscriptionInfoRecord(mDevice.getAddress(), mDevice.getName(), 0,
                        SubscriptionManager.SUBSCRIPTION_TYPE_REMOTE_SIM);
        SubscriptionInfo info = mSubscriptionManager
                .getActiveSubscriptionInfoForIcc(mDevice.getAddress());
@@ -156,7 +156,7 @@ class MapClientContent {
            ArrayList<VCardEntry> recipients = message.getRecipients();
            if (recipients != null && !recipients.isEmpty()) {
                mPhoneNumber = PhoneNumberUtils.extractNetworkPortion(
                        recipients.get(0).getPhoneList().get(0).getNumber());
                        getFirstRecipientNumber(message));
            }
        } else {
            mPhoneNumber = PhoneNumberUtils.extractNetworkPortion(getOriginatorNumber(message));
@@ -192,7 +192,11 @@ class MapClientContent {
        if (INBOX_PATH.equals(message.getFolder())) {
            recipients = getOriginatorNumber(message);
        } else {
            recipients = message.getRecipients().get(0).getPhoneList().get(0).getNumber();
            recipients = getFirstRecipientNumber(message);
            if (recipients == null) {
                logD("invalid recipients");
                return;
            }
        }
        logV("Received SMS from Number " + recipients);
        String messageContent;
@@ -379,11 +383,22 @@ class MapClientContent {
        return mResolver.insert(Mms.CONTENT_URI, mmsValues);
    }

    /**
     * cleanUp
     * clear the subscription info and content on shutdown
     */
    void cleanUp() {
        clearMessages();
        mSubscriptionManager.removeSubscriptionInfoRecord(mDevice.getAddress(),
                    SubscriptionManager.SUBSCRIPTION_TYPE_REMOTE_SIM);
    }


    /**
     * clearMessages
     * clean up the content provider on startup and shutdown
     * clean up the content provider on startup
     */
    void clearMessages() {
    private void clearMessages() {
        mResolver.unregisterContentObserver(mContentObserver);
        mResolver.delete(Sms.CONTENT_URI, Sms.SUBSCRIPTION_ID + " =? ",
                new String[]{Integer.toString(mSubscriptionId)});
@@ -403,8 +418,14 @@ class MapClientContent {
            messageContacts.add(originator);
        }
        getRecipientsFromMessage(message, messageContacts);
        // If there is only one contact don't remove it.
        if (messageContacts.isEmpty()) {
            return Telephony.Threads.COMMON_THREAD;
        } else if (messageContacts.size() > 1) {
            messageContacts.removeIf(number -> (PhoneNumberUtils.compareLoosely(number,
                    mPhoneNumber)));
        }

        messageContacts.removeIf(number -> (PhoneNumberUtils.compareLoosely(number, mPhoneNumber)));
        logV("Contacts = " + messageContacts.toString());
        return Telephony.Threads.getOrCreateThreadId(mContext, messageContacts);
    }
@@ -413,7 +434,7 @@ class MapClientContent {
        List<VCardEntry> recipients = message.getRecipients();
        for (VCardEntry recipient : recipients) {
            List<VCardEntry.PhoneData> phoneData = recipient.getPhoneList();
            if (phoneData != null && phoneData.size() > 0) {
            if (phoneData != null && !phoneData.isEmpty()) {
                messageContacts
                        .add(PhoneNumberUtils.extractNetworkPortion(phoneData.get(0).getNumber()));
            }
@@ -422,15 +443,32 @@ class MapClientContent {

    private String getOriginatorNumber(Bmessage message) {
        VCardEntry originator = message.getOriginator();
        if (originator != null) {
        if (originator == null) {
            return null;
        }

        List<VCardEntry.PhoneData> phoneData = originator.getPhoneList();
            if (phoneData != null && phoneData.size() > 0) {
        if (phoneData == null || phoneData.isEmpty()) {
            return null;
        }

        return PhoneNumberUtils.extractNetworkPortion(phoneData.get(0).getNumber());
    }

    private String getFirstRecipientNumber(Bmessage message) {
        List<VCardEntry> recipients = message.getRecipients();
        if (recipients == null || recipients.isEmpty()) {
            return null;
        }

        List<VCardEntry.PhoneData> phoneData = recipients.get(0).getPhoneList();
        if (phoneData == null || phoneData.isEmpty()) {
            return null;
        }

        return phoneData.get(0).getNumber();
    }

    /**
     * addThreadContactToEntries
     * utilizing the thread id fill in the appropriate fields of bmsg with the intended recipients
+3 −2
Original line number Diff line number Diff line
@@ -286,7 +286,8 @@ class MceStateMachine extends StateMachine {
                    Log.d(TAG, "Scheme " + contact.getScheme());
                }
                if (PhoneAccount.SCHEME_TEL.equals(contact.getScheme())) {
                    if (contact.getPath().contains(Telephony.Threads.CONTENT_URI.toString())) {
                    String path = contact.getPath();
                    if (path != null && path.contains(Telephony.Threads.CONTENT_URI.toString())) {
                        mDatabase.addThreadContactsToEntries(bmsg, contact.getLastPathSegment());
                    } else {
                        VCardEntry destEntry = new VCardEntry();
@@ -622,7 +623,7 @@ class MceStateMachine extends StateMachine {

        @Override
        public void exit() {
            mDatabase.clearMessages();
            mDatabase.cleanUp();
            mPreviousState = BluetoothProfile.STATE_CONNECTED;
        }

+23 −4
Original line number Diff line number Diff line
@@ -173,7 +173,7 @@ public class MapClientContentTest {
        Assert.assertEquals(2, mMockSmsContentProvider.mContentValues.size());
        Assert.assertEquals(0, mMockMmsContentProvider.mContentValues.size());

        mMapClientContent.clearMessages();
        mMapClientContent.cleanUp();
        Assert.assertEquals(0, mMockSmsContentProvider.mContentValues.size());
    }

@@ -191,7 +191,7 @@ public class MapClientContentTest {
        mMapClientContent.storeMessage(mTestMessage2, mTestMessage1Handle, mTestMessage1Timestamp);
        Assert.assertEquals(2, mMockMmsContentProvider.mContentValues.size());

        mMapClientContent.clearMessages();
        mMapClientContent.cleanUp();
        Assert.assertEquals(0, mMockMmsContentProvider.mContentValues.size());
    }

@@ -209,7 +209,7 @@ public class MapClientContentTest {
        mMapClientContent.storeMessage(mTestMessage2, mTestMessage2Handle, mTestMessage1Timestamp);
        Assert.assertEquals(2, mMockMmsContentProvider.mContentValues.size());

        mMapClientContent.clearMessages();
        mMapClientContent.cleanUp();
        Assert.assertEquals(0, mMockMmsContentProvider.mContentValues.size());
    }

@@ -229,7 +229,7 @@ public class MapClientContentTest {

        mMapClientContent.markRead(mTestMessage1Handle);

        mMapClientContent.clearMessages();
        mMapClientContent.cleanUp();
        Assert.assertEquals(0, mMockMmsContentProvider.mContentValues.size());
    }

@@ -305,6 +305,25 @@ public class MapClientContentTest {
        Assert.assertEquals("5551212", mMapClientContent.mPhoneNumber);
    }

    /**
     * Test to validate that some poorly formatted messages don't crash.
     */
    @Test
    public void testStoreBadMessage() {
        mMapClientContent = new MapClientContent(mMockContext, mCallbacks, mTestDevice);
        mTestMessage1 = new Bmessage();
        mTestMessage1.setBodyContent("HelloWorld");
        mTestMessage1.setType(Bmessage.Type.SMS_GSM);
        mTestMessage1.setFolder("telecom/msg/sent");
        mMapClientContent.storeMessage(mTestMessage1, mTestMessage1Handle, mTestMessage1Timestamp);

        mTestMessage2 = new Bmessage();
        mTestMessage2.setBodyContent("HelloWorld");
        mTestMessage2.setType(Bmessage.Type.MMS);
        mTestMessage2.setFolder("telecom/msg/inbox");
        mMapClientContent.storeMessage(mTestMessage2, mTestMessage2Handle, mTestMessage1Timestamp);
    }

    void createTestMessages() {
        mOriginator = new VCardEntry();
        VCardProperty property = new VCardProperty();