~aleteoryx/muditaos

abdf9b7c45e9fe4f779d6b60bc74faf17b4dbbac — rrandomsky 3 years ago 4b6e06e
[MOS-737] Revert "Fix for adding a country code prefix to existing ..."

This reverts commit 14d6d53ac84de3648c07e57fd9bf834f6461bcdd,
because it can cause critical error for SMS application.
M module-db/Interface/ContactRecord.cpp => module-db/Interface/ContactRecord.cpp +10 -36
@@ 124,13 124,9 @@ auto ContactRecordInterface::Update(const ContactRecord &rec) -> bool
    }

    auto oldNumberIDs  = splitNumberIDs(contact.numbersID);
    auto newNumbersIDs = getNumbersIDs(contact.ID, rec, utils::PhoneNumber::Match::EXACT);
    auto newNumbersIDs = getNumbersIDs(contact.ID, rec);
    for (auto oldNumberID : oldNumberIDs) {
        if (std::find(std::begin(newNumbersIDs), std::end(newNumbersIDs), oldNumberID) == std::end(newNumbersIDs)) {
            // If oldNumberID is NOT in newNumbersIDs vector then:
            //  -> remove oldNumberID from DB - if the old number is the same as one of the new ones
            //     but with different country number (to prevent a mismatch of same numbers)
            //  -> make temporary contact with this oldNumberID - otherwise
            auto numberRecord = contactDB->number.getById(oldNumberID);
            if (!numberRecord.isValid()) {
                return false;


@@ 145,34 141,13 @@ auto ContactRecordInterface::Update(const ContactRecord &rec) -> bool
                          e.what());
                return false;
            }

            bool isOldNumberToRemove = false;
            utils::PhoneNumber oldPhoneNumber(numberRecord.numberUser, numberRecord.numbere164);
            for (const auto newNumberID : newNumbersIDs) {
                auto newNumberRecord = contactDB->number.getById(newNumberID);
                utils::PhoneNumber newPhoneNumber(newNumberRecord.numberUser, newNumberRecord.numbere164);
                if (newPhoneNumber.match(oldPhoneNumber) >= utils::PhoneNumber::Match::POSSIBLE &&
                    oldPhoneNumber.getCountryCode() != newPhoneNumber.getCountryCode()) {
                    isOldNumberToRemove = true;
                }
            }

            if (isOldNumberToRemove) {
                // remove old number from DB table
                if (!contactDB->number.removeById(oldNumberID)) {
                    return false;
                }
            const auto tmpContactRecord = addTemporaryContactForNumber(number);
            if (!tmpContactRecord.has_value()) {
                return false;
            }
            else {
                // make temporary contact with old number
                const auto tmpContactRecord = addTemporaryContactForNumber(number);
                if (!tmpContactRecord.has_value()) {
                    return false;
                }
                numberRecord.contactID = tmpContactRecord.value().ID;
                if (!contactDB->number.update(numberRecord)) {
                    return false;
                }
            numberRecord.contactID = tmpContactRecord.value().ID;
            if (!contactDB->number.update(numberRecord)) {
                return false;
            }
        }
    }


@@ 220,9 195,8 @@ auto ContactRecordInterface::Update(const ContactRecord &rec) -> bool
    return true;
}

auto ContactRecordInterface::getNumbersIDs(std::uint32_t contactID,
                                           const ContactRecord &contact,
                                           utils::PhoneNumber::Match matchLevel) -> std::vector<std::uint32_t>
auto ContactRecordInterface::getNumbersIDs(std::uint32_t contactID, const ContactRecord &contact)
    -> std::vector<std::uint32_t>
{
    std::vector<std::uint32_t> result;



@@ 239,7 213,7 @@ auto ContactRecordInterface::getNumbersIDs(std::uint32_t contactID,
            return {};
        }

        auto numberMatch = numberMatcher.bestMatch(phoneNumber, matchLevel);
        auto numberMatch = numberMatcher.bestMatch(phoneNumber, utils::PhoneNumber::Match::POSSIBLE);
        if (!numberMatch.has_value()) {
            // number does not exist in the DB yet. Let's add it.
            if (!contactDB->number.add(ContactsNumberTableRow{Record(DB_ID_NONE),

M module-db/Interface/ContactRecord.hpp => module-db/Interface/ContactRecord.hpp +1 -4
@@ 289,10 289,7 @@ class ContactRecordInterface : public RecordInterface<ContactRecord, ContactReco
        -> const std::unique_ptr<db::QueryResult>;

    auto addTemporaryContactForNumber(const ContactRecord::Number &number) -> std::optional<ContactRecord>;
    auto getNumbersIDs(std::uint32_t contactID,
                       const ContactRecord &contact,
                       utils::PhoneNumber::Match matchLevel = utils::PhoneNumber::Match::POSSIBLE)
        -> std::vector<std::uint32_t>;
    auto getNumbersIDs(std::uint32_t contactID, const ContactRecord &contact) -> std::vector<std::uint32_t>;
    auto addNumbers(std::uint32_t contactID, const std::vector<ContactRecord::Number> &numbers)
        -> std::optional<std::string>;
    auto addOrUpdateName(std::uint32_t contactID, std::uint32_t nameID, const ContactRecord &contact)

M module-db/tests/ContactsRecord_tests.cpp => module-db/tests/ContactsRecord_tests.cpp +1 -255
@@ 264,12 264,7 @@ TEST_CASE("Contact record numbers update")
    auto records = ContactRecordInterface(&contactDB);

    ContactRecord testRecord, otherRecord;
    std::array<std::string, 4> numbers   = {{{"600100100"}, {"600100200"}, {"600100300"}, {"600100400"}}};
    std::array<std::string, 4> numbersPL = {
        {{"+48600100100"}, {"+48600100200"}, {"+48600100300"}, {"+48600100400"}}}; // Poland country code
    std::array<std::string, 4> numbersFR = {
        {{"+33600100100"}, {"+33600100200"}, {"+33600100300"}, {"+33600100400"}}}; // France country code
    std::array<std::string, 2> unUsedNumbers = {{{"612130140"}, {"612130141"}}};
    std::array<std::string, 4> numbers = {{{"600100100"}, {"600100200"}, {"600100300"}, {"600100400"}}};

    testRecord.primaryName     = "number";
    testRecord.alternativeName = "test";


@@ 374,223 369,6 @@ TEST_CASE("Contact record numbers update")
        REQUIRE(validatationRecord.numbers[0].number.getEntered() == numbers[3]);
    }

    SECTION("Single number update - new unused number")
    {
        auto newRecord = records.GetByID(1);
        REQUIRE(newRecord.numbers.size() == 2);

        newRecord.numbers =
            std::vector<ContactRecord::Number>({ContactRecord::Number(unUsedNumbers[0], std::string("")),
                                                ContactRecord::Number(numbers[1], std::string(""))});
        REQUIRE(records.Update(newRecord));
        REQUIRE(contactDB.contacts.count() == 2); // amount of non-temporary contacts
        REQUIRE(contactDB.number.count() == 5);
        REQUIRE(contactDB.number.getById(1).contactID != 1); // old numbers do not belong to any contact
        REQUIRE(contactDB.number.getById(1).contactID != 2);

        auto validationRecord = records.GetByID(1);
        REQUIRE(validationRecord.numbers.size() == 2);
        REQUIRE(validationRecord.numbers[0].number.getEntered() == unUsedNumbers[0]);
        REQUIRE(validationRecord.numbers[1].number.getEntered() == numbers[1]);

        validationRecord = records.GetByID(2);
        REQUIRE(validationRecord.numbers.size() == 2);
        REQUIRE(validationRecord.numbers[0].number.getEntered() == numbers[2]);
        REQUIRE(validationRecord.numbers[1].number.getEntered() == numbers[3]);

        // A temporary contact for number[0] (which was previously assigned to recordID=1) has been created.
        validationRecord = records.GetByIdWithTemporary(3);
        REQUIRE(validationRecord.ID != DB_ID_NONE);
        REQUIRE(validationRecord.numbers[0].number.getEntered() == numbers[0]);
    }

    SECTION("Single number update twice - new unused number")
    {
        auto newRecord = records.GetByID(1);
        REQUIRE(newRecord.numbers.size() == 2);

        newRecord.numbers =
            std::vector<ContactRecord::Number>({ContactRecord::Number(unUsedNumbers[0], std::string("")),
                                                ContactRecord::Number(numbers[1], std::string(""))});
        REQUIRE(records.Update(newRecord));

        newRecord.numbers =
            std::vector<ContactRecord::Number>({ContactRecord::Number(unUsedNumbers[1], std::string("")),
                                                ContactRecord::Number(numbers[1], std::string(""))});
        REQUIRE(records.Update(newRecord));
        REQUIRE(contactDB.contacts.count() == 2); // amount of non-temporary contacts
        REQUIRE(contactDB.number.count() == 6);
        REQUIRE(contactDB.number.getById(1).contactID != 1); // old numbers do not belong to any contact
        REQUIRE(contactDB.number.getById(1).contactID != 2);
        REQUIRE(contactDB.number.getById(5).contactID != 1);
        REQUIRE(contactDB.number.getById(5).contactID != 2);

        auto validationRecord = records.GetByID(1);
        REQUIRE(validationRecord.numbers.size() == 2);
        REQUIRE(validationRecord.numbers[0].number.getEntered() == unUsedNumbers[1]);
        REQUIRE(validationRecord.numbers[1].number.getEntered() == numbers[1]);

        validationRecord = records.GetByID(2);
        REQUIRE(validationRecord.numbers.size() == 2);
        REQUIRE(validationRecord.numbers[0].number.getEntered() == numbers[2]);
        REQUIRE(validationRecord.numbers[1].number.getEntered() == numbers[3]);

        // A temporary contact for number ID 1 (which was previously assigned to recordID=1) has been created.
        validationRecord = records.GetByIdWithTemporary(3);
        REQUIRE(validationRecord.ID != DB_ID_NONE);
        REQUIRE(validationRecord.numbers[0].number.getEntered() == numbers[0]);

        // A temporary contact for numberID 5 (which was previously assigned to recordID=1 for a moment) has been
        // created.
        validationRecord = records.GetByIdWithTemporary(4);
        REQUIRE(validationRecord.ID != DB_ID_NONE);
        REQUIRE(validationRecord.numbers[0].number.getEntered() == unUsedNumbers[0]);
    }

    SECTION("Both numbers update - new newer used number")
    {
        auto newRecord = records.GetByID(1);
        REQUIRE(newRecord.numbers.size() == 2);

        newRecord.numbers =
            std::vector<ContactRecord::Number>({ContactRecord::Number(unUsedNumbers[0], std::string("")),
                                                ContactRecord::Number(unUsedNumbers[1], std::string(""))});
        REQUIRE(records.Update(newRecord));
        REQUIRE(contactDB.contacts.count() == 2); // amount of non-temporary contacts
        REQUIRE(contactDB.number.count() == 6);
        REQUIRE(contactDB.number.getById(1).contactID != 1); // old numbers do not belong to any contact
        REQUIRE(contactDB.number.getById(1).contactID != 2);
        REQUIRE(contactDB.number.getById(2).contactID != 1);
        REQUIRE(contactDB.number.getById(2).contactID != 2);

        auto validationRecord = records.GetByID(1);
        REQUIRE(validationRecord.numbers.size() == 2);
        REQUIRE(validationRecord.numbers[0].number.getEntered() == unUsedNumbers[0]);
        REQUIRE(validationRecord.numbers[1].number.getEntered() == unUsedNumbers[1]);

        validationRecord = records.GetByID(2);
        REQUIRE(validationRecord.numbers.size() == 2);
        REQUIRE(validationRecord.numbers[0].number.getEntered() == numbers[2]);
        REQUIRE(validationRecord.numbers[1].number.getEntered() == numbers[3]);

        // A temporary contact for number ID 1 (which was previously assigned to recordID=1) has been created.
        validationRecord = records.GetByIdWithTemporary(3);
        REQUIRE(validationRecord.ID != DB_ID_NONE);
        REQUIRE(validationRecord.numbers[0].number.getEntered() == numbers[0]);

        // A temporary contact for numberID 2 (which was previously assigned to recordID=1) has been created.
        validationRecord = records.GetByIdWithTemporary(4);
        REQUIRE(validationRecord.ID != DB_ID_NONE);
        REQUIRE(validationRecord.numbers[0].number.getEntered() == numbers[1]);
    }

    SECTION("Single number update - add country code")
    {
        auto newRecord = records.GetByID(1);
        REQUIRE(newRecord.numbers.size() == 2);

        newRecord.numbers = std::vector<ContactRecord::Number>(
            {ContactRecord::Number(numbersPL[0], std::string("")), ContactRecord::Number(numbers[1], std::string(""))});
        REQUIRE(records.Update(newRecord));
        REQUIRE(contactDB.number.count() == 4);

        auto validationRecord = records.GetByID(1);
        REQUIRE(validationRecord.numbers.size() == 2);
        REQUIRE(validationRecord.numbers[0].number.getEntered() == numbersPL[0]);
        REQUIRE(validationRecord.numbers[1].number.getEntered() == numbers[1]);

        validationRecord = records.GetByID(2);
        REQUIRE(validationRecord.numbers.size() == 2);
        REQUIRE(validationRecord.numbers[0].number.getEntered() == numbers[2]);
        REQUIRE(validationRecord.numbers[1].number.getEntered() == numbers[3]);

        // there is no new temporary number
        validationRecord = records.GetByIdWithTemporary(3);
        REQUIRE(validationRecord.ID == DB_ID_NONE);
        REQUIRE(validationRecord.numbers.empty());
    }

    SECTION("Single number update - change country code")
    {
        auto newRecord = records.GetByID(1);
        REQUIRE(newRecord.numbers.size() == 2);

        newRecord.numbers = std::vector<ContactRecord::Number>({ContactRecord::Number(numbersPL[0], std::string("")),
                                                                ContactRecord::Number(numbersPL[1], std::string(""))});
        REQUIRE(records.Update(newRecord));
        REQUIRE(contactDB.number.count() == 4);

        auto validationRecord = records.GetByID(1);
        REQUIRE(validationRecord.numbers.size() == 2);
        REQUIRE(validationRecord.numbers[0].number.getEntered() == numbersPL[0]);
        REQUIRE(validationRecord.numbers[1].number.getEntered() == numbersPL[1]);
        REQUIRE(contactDB.contacts.count() == 2); // amount of non-temporary contacts

        newRecord.numbers = std::vector<ContactRecord::Number>({ContactRecord::Number(numbersFR[0], std::string("")),
                                                                ContactRecord::Number(numbersPL[1], std::string(""))});
        REQUIRE(records.Update(newRecord));
        REQUIRE(contactDB.number.count() == 5);

        validationRecord = records.GetByID(1);
        REQUIRE(validationRecord.numbers.size() == 2);
        REQUIRE(validationRecord.numbers[0].number.getEntered() == numbersFR[0]);
        REQUIRE(validationRecord.numbers[1].number.getEntered() == numbersPL[1]);

        validationRecord = records.GetByID(2);
        REQUIRE(validationRecord.numbers.size() == 2);
        REQUIRE(validationRecord.numbers[0].number.getEntered() == numbers[2]);
        REQUIRE(validationRecord.numbers[1].number.getEntered() == numbers[3]);

        // There is new temporary contact for number[0] (which was previously assigned to recordID=1) with
        // old country code
        validationRecord = records.GetByIdWithTemporary(3);
        REQUIRE(validationRecord.ID != DB_ID_NONE);
        REQUIRE(validationRecord.numbers[0].number.getEntered() == numbersPL[0]);

        // There is new temporary contact for number[1] (which was previously assigned to recordID=1) with
        // old country code
        validationRecord = records.GetByIdWithTemporary(4);
        REQUIRE(validationRecord.ID == DB_ID_NONE);
        REQUIRE(validationRecord.numbers.empty());
    }

    SECTION("Both number update - remove country code")
    {
        auto newRecord = records.GetByID(1);
        REQUIRE(newRecord.numbers.size() == 2);

        newRecord.numbers = std::vector<ContactRecord::Number>({ContactRecord::Number(numbersPL[0], std::string("")),
                                                                ContactRecord::Number(numbersFR[1], std::string(""))});
        REQUIRE(records.Update(newRecord));
        REQUIRE(contactDB.number.count() == 4);

        auto validationRecord = records.GetByID(1);
        REQUIRE(validationRecord.numbers.size() == 2);
        REQUIRE(validationRecord.numbers[0].number.getEntered() == numbersPL[0]);
        REQUIRE(validationRecord.numbers[1].number.getEntered() == numbersFR[1]);
        REQUIRE(contactDB.contacts.count() == 2); // amount of non-temporary contacts

        newRecord.numbers = std::vector<ContactRecord::Number>(
            {ContactRecord::Number(numbers[0], std::string("")), ContactRecord::Number(numbers[1], std::string(""))});
        REQUIRE(records.Update(newRecord));
        REQUIRE(contactDB.number.count() == 4);

        validationRecord = records.GetByID(1);
        REQUIRE(validationRecord.numbers.size() == 2);
        REQUIRE(validationRecord.numbers[0].number.getEntered() == numbers[0]);
        REQUIRE(validationRecord.numbers[1].number.getEntered() == numbers[1]);

        validationRecord = records.GetByID(2);
        REQUIRE(validationRecord.numbers.size() == 2);
        REQUIRE(validationRecord.numbers[0].number.getEntered() == numbers[2]);
        REQUIRE(validationRecord.numbers[1].number.getEntered() == numbers[3]);

        // There is no new temporary number
        validationRecord = records.GetByIdWithTemporary(3);
        REQUIRE(validationRecord.ID == DB_ID_NONE);
        REQUIRE(validationRecord.numbers.empty());
    }

    SECTION("Change both numbers")
    {
        auto newRecord = records.GetByID(1);


@@ 622,38 400,6 @@ TEST_CASE("Contact record numbers update")
        REQUIRE(validationRecord.numbers[0].number.getEntered() == numbers[1]);
    }

    SECTION("Change both numbers - same number with different country code")
    {
        auto newRecord = records.GetByID(1);
        REQUIRE(newRecord.numbers.size() == 2);

        newRecord.numbers = std::vector<ContactRecord::Number>({ContactRecord::Number(numbersPL[0], std::string("")),
                                                                ContactRecord::Number(numbersFR[0], std::string(""))});
        REQUIRE(records.Update(newRecord));
        REQUIRE(contactDB.number.count() == 5);

        auto validationRecord = records.GetByIdWithTemporary(1);
        REQUIRE(validationRecord.ID != DB_ID_NONE);
        REQUIRE(validationRecord.numbers[0].number.getEntered() == numbersPL[0]);
        REQUIRE(validationRecord.numbers[1].number.getEntered() == numbersFR[0]);
        REQUIRE(contactDB.contacts.count() == 2); // amount of non-temporary contacts

        validationRecord = records.GetByID(2);
        REQUIRE(validationRecord.numbers.size() == 2);
        REQUIRE(validationRecord.numbers[0].number.getEntered() == numbers[2]);
        REQUIRE(validationRecord.numbers[1].number.getEntered() == numbers[3]);

        // A temporary contact for number[1] (which was previously assigned to recordID=1) has been created.
        validationRecord = records.GetByIdWithTemporary(3);
        REQUIRE(validationRecord.ID != DB_ID_NONE);
        REQUIRE(validationRecord.numbers[0].number.getEntered() == numbers[1]);

        // There is no new temporary number
        validationRecord = records.GetByIdWithTemporary(4);
        REQUIRE(validationRecord.ID == DB_ID_NONE);
        REQUIRE(validationRecord.numbers.empty());
    }

    Database::deinitialize();
}


M pure_changelog.md => pure_changelog.md +0 -1
@@ 41,7 41,6 @@
* Fixed windows flow regarding PUK requests after too many PIN mistakes
* Fixed disappearing "confirm" button in PIN entering screen
* Fixed looping on the SIM card selection screen
* Fixed adding country code prefix to existing contact
* Fixed screen lock during onboarding

### Added