1
0
mirror of https://github.com/qTox/qTox.git synced 2024-03-22 14:00:36 +08:00
Commit Graph

39 Commits

Author SHA1 Message Date
Anthony Bilinski
9a8706a65f
fix(history): Heal duplicate peer entries with different case
Prior to 2f4e8dc3e8 we would take
the written ToxID and insert that straight into history without
any case check

Must be done prior to schema 11 since even though the UNIQUE constraint
on the peers table is fooled by the different case, the UNIQUE
constraint on the new chats and authors table which are stored as BLOBS
fail during upgrade when the two different case but equal ToxPks
collide.

Unfortunately it can't be done as its own upgrade since 11 was already
merged, and this is a prerequisite for 11 to pass for some users.

Execute prior to starting the split peer upgrade instead of as a larger
transaction for simplicity of the split upgrade, and since executing
this deduplication is idempotent.
2022-05-22 11:15:59 -07:00
Anthony Bilinski
dc46267833
fix(test): Don't rely on row IDs after moving tables
Row ID's are not guaranteed to match those from the original peer table.

New checking method is equally strict since we already verify the number
of entries, and the SQL schema guarantees that entries are unique.
2022-05-21 20:49:32 -07:00
Anthony Bilinski
6ad92bb637
test(history): Add unit test for when db is newer than qTox supports 2022-05-20 11:38:12 -07:00
Anthony Bilinski
9571434df9
feat(CI): Disallow unsafe implicit casts to QString
Covers char* without size, and QByteArray.

Catches the case of QByteArray to QString implicit conversion like was
fixed in 47ee51c61d, but still allows
construction or assignment from string literals in source. Gives most
of the type safety of QT_NO_CAST_FROM_ASCII without having to wrap
every literal string in QStringLiteral.

No functional issues found during change.
2022-04-05 12:10:05 -07:00
Anthony Bilinski
16ac8a8eac
refactor(History): Split peers table into chats and authors
peers had combined meaning, both being referenced by history for which
chat a message was in, and being reference by aliases for who authored a
message. This means that peers had conceptually different sub-groups:
all friends are both a chat and an author, but self is an author but not
a chat. With the addition of group chats this is amplified by groups
themselves being chats but not authors, and group members being authors
but not chats. Instead of having four sub-groups all within peers,
splitting peers into chats and authors gives a clean mapping,
simplifying interactions with the data.

In the new chats and authors tables, store what used to be a public_key
string as a BLOB, since it’s inherently a 32-byte binary value in both
cases. Call the public_key a UUID for chats, since group IDs are not
defined as public keys by toxcore.

Even though the data change is quite minor, the upgrade is large because
of SQLite's lack of support for modifying foreign key constrains for
existing tables. This means when peers are moved to new tables, all
tables referencing peers need to be cloned with a new foreign key
constraint, as well as all tables referencing those, recursively.
2022-03-29 21:27:01 -07:00
Anthony Bilinski
f6dddf7c58
refactor(History): Move history upgrades to new directory
Upcoming upgrade is fairly large, and all the helper functions for each
upgrade are becoming ambiguous.
2022-03-27 23:33:38 -07:00
Anthony Bilinski
f0a23bbb5d
refactor(tests): Move database test utilities to their own lib
So that we can have multiple db upgrade tests that can run in parallel,
instead of one monster test that runs independent test cases sequentially.
2022-03-27 23:32:11 -07:00
Anthony Bilinski
d1a8f5d6ae
refactor(test): Use temporary files in dbschema_test
Files are conceptually temporary, having extra conflict handling logic
is unnecessary, and having the test fail to run if it crashed on last
invocation is annoying.
2022-03-27 22:59:27 -07:00
Anthony Bilinski
f777aa885c
fix(history): Heal invalid resume_file_id's saved to history
Replace underlength resume_file_id's with arbitrary data. Loaded file IDs are
not used for anything at this time, but they should not be null nor invalid.
Any 32-byte value is valid, so use all 0's for consistency.

Fix #6553
2022-03-25 16:47:52 -07:00
Anthony Bilinski
d7b67081e5
refactor(history): Separate db upgrade logic from History
Allows for cleaner testability of upgrade logic and reduces the overall size
and clutter of History.
2022-03-19 21:27:40 -07:00
Anthony Bilinski
3d7a0d249d
refactor: Comply with Clang's Wunused-const-variable 2022-03-15 08:19:53 -07:00
Anthony Bilinski
cabcf4111f
refactor(style): Match declaration and definition argument names
Conform with readability-named-parameter and
readability-inconsistent-declaration-parameter-name
2022-03-15 08:19:53 -07:00
Anthony Bilinski
b894531cdb
fix(tests): Mock Settings for SmileyPack test
Settings upgrades global settings on construction, which can cause the
SmileyPack test to be inconsistent based on file system state.

Fix #6530
2022-03-15 01:32:16 -07:00
Anthony Bilinski
0c967725df
refactor: Remove Settings singleton
* Make main.cpp's toxSave free functions into a ToxSave class so that it can be
  given Settings on construction.
* Add void* to IPC callbacks so that classes can get back to themselves.
2022-03-13 16:00:48 -07:00
Anthony Bilinski
47328cc6bf
refactor: Remove SmileyPack singleton 2022-03-12 16:28:06 -08:00
Anthony Bilinski
adc0f0cca6
refactor: Comply with Wmissing-declarations
* Move free functions to the anonymous namespace
* Additionally move static free functions to the anonymous namespace
* Move functions that must be accessed externally to static class functions
2022-03-11 10:08:02 -08:00
Anthony Bilinski
02d5270dcc
refactor: Comply with Wmissing-field-initializers
Add explicit missing initializers.
2022-03-11 10:08:02 -08:00
Anthony Bilinski
9ac44ee09c
fix(history): Replace invalid Tox ID saved in peers table with Tox public key
Due to an old bug that has since be fixed, old history dbs can contain both a
Tox ID version and Tox public key version of the same friend, and always
themselves. They could have n more duplicates if they've updated their nospam.

Tox ID is an invalid length to be stored in strongly typed ToxPk, and in
general having multiple entries belonging to the same user effectively violates
our UNIQUE constraint on public_key.

Introduced in 7168d2b858

Fix #6485
2022-02-20 14:27:33 -08:00
Anthony Bilinski
557af80428
refactor(Paths): Remove Paths factory to enable copy construction
std::atomic disallows copy construction and the default constructor disables
the parameterized constructor.

Additionally the case where paths aren't writable isn't handled and would just
segfault in Settings previously, so no safety is lost.
2022-02-16 20:15:46 -08:00
Mick Sayson
18109b2f7f feat(history): Save/load system messages to history 2021-10-16 14:29:57 -07:00
Mick Sayson
e9131d33aa
feat(chatlog): Upgrade db schema to support system messages
* Resolves #6221
* System message schema designed to take enum of message base + args
* New table layout required many updates to the queries executed by
  history
* Bonus reduction of history signals/slots by issuing some file transfer
  insertions directly when possible
2021-05-02 03:26:04 -07:00
Waris Boonyasiriwat
7a26fe1708 test(persistence): add smileypack unit test
A follow-up of issue #5147, add a unit test which ensures
the same bug won't come up again.
2021-02-20 16:36:11 -08:00
Mick Sayson
5f5f612841
feat(messages): History and offline message support for extended messages
* Added new negotiating friend state to allow delayed sending of offline
messages
* Added ability to flag currently outgoing message as broken in UI
* Reworked OfflineMsgEngine to support multiple receipt types
    * Moved resending logic out of the OfflineMsgEngine
    * Moved coordination of receipt and DispatchedMessageId into helper
    class usable for both ExtensionReceiptNum and ReceiptNum
    * Resending logic now has a failure case when the friend's extension
    set is lower than the required extensions needed for the message
    * When a user is known to be offline we do not allow use of any
    extensions
* Added DB support for broken message reasons
* Added DB support to tie an faux_offline_pending message to a required
extension set
2021-01-30 12:52:06 -08:00
Anthony Bilinski
5d56a3c039
refactor(paths): move Settings path functions into Paths 2020-05-10 18:03:47 -07:00
Anthony Bilinski
062ba03fb8
refactor(db): map foreign key dependency in db schema
Reorder deletion of history to avoid violating constraint.
2020-05-03 18:06:10 -07:00
iphydf
e71225268f
chore: Various code cleanups.
* Reorder class data members and/or constructor initialisers to match,
  reducing confusion about when members will be initialised.
* Remove (most) unused variables. Not removed: some global variables with
  `TODO(sudden6)` on them for using them in the future. I don't know how
  far into the future sudden6 wants to use them, so I left them there for
  now.
* Distinguish different bootstrap nodes in the logs by index in the
  bootstrap node list. Originally, we used to log the address/port of the
  node we're bootstrapping to. This was removed out of privacy concerns
  (even though the bootstrap nodes are public). This made the logs much
  less useful when debugging why the client isn't connecting. Having
  indices makes it easier to see that different nodes are being selected,
  and makes it possible to determine which node was selected.
* Explicitly cast unused results of Tox API functions to `void` when all
  we want is to know whether the function succeeds or not.
* Don't try to `#include <unistd.h>` on Windows. It does not exist on
  MSVC.
* Remove extra `;` after function definitions.
* Remove reference indirection of QJsonValueRef, since a copy of that ref
  (small pointer-like object) has to be made anyway when iterating over
  QJsonArrays.
* Make some file-scope global state `static`.
* Use `nullptr` instead of `NULL`.
* Add `#if DESKTOP_NOTIFICATIONS` around the code that implements desktop
  notifications, so it becomes a bit easier to compile everything with a
  single compiler command - useful for manually running static analysers.
* Fix an error on MSVC where `disconnect` is looked up to be a non-static
  member function and the `this` capture is missing.
* Consistently use `struct` and `class` tags for types.
* Use references in ranged-for where it reduces copies.
* Move private static data members out of the Style class and into
  file-local scope. There is no need for them to be in the class. Also
  marked them `const` where possible.
* Removed unused lambda capture.
* Ensure qTox can compile under NDEBUG with `-Wunused-variable` by
  inlining the unused variable into the `assert` that was its only
  target.
* Minor reformatting in core_test.cpp.
2020-04-16 19:07:40 +00:00
Anthony Bilinski
239dfdc65c
refactor(status): move isOnline into Status from Friend
Allows checking if a status if equivalent to Online without needing a Friend
class.
2019-11-25 20:52:06 -08:00
Anthony Bilinski
05064771ab
fix(test): create db tables in defined order, verify indexes
indexes need to be created after their corresponding table is created.
QMap doesn't enforce insertion order, just key order, so use a vector.
Also verify indexes from sql_master instead of only tables.
2019-11-25 16:21:17 -08:00
Anthony Bilinski
edd72906fb
perf(history): enable sql index on chat_id in history table
This makes every query with a "WHERE history.chat_id" clause quicker,
improving history load time by 50% on my profile.

Related to #5812
2019-11-25 16:21:17 -08:00
Anthony Bilinski
746314baf2
fix(history): move stuck action messages to broken_messages table
Before a bug in qTox would make it possible for a user to try to send an empty
action type message. This would fail to send at toxcore, but still be persisted
in history, causing it to fail every time FauxOfflineEngine tried to resend
it. Moving these stuck messages into the broke_messages table will stop qTox
from attempting to deliver them on each connect, and display in the GUI to
users that the messages aren't really pending anymore.
2019-10-20 02:35:20 -07:00
Anthony Bilinski
b28dc30061
fix(history): move stuck pending message into broken_messages table
Fix #5776

Due to a long standing bug, faux offline message have been able to become stuck
going back years. Because of recent fixes to history loading, faux offline
messages will correctly all be sent on connection, but this causes an issue of
long stuck messages suddenly being delivered to a friend, out of context,
creating a confusing interaction. To work around this, this upgrade moves any
faux offline messages in a chat that are older than the last successfully
delivered message, indicating they were stuck, to a new table,
`broken_messages`, preventing them from ever being sent in the future.
2019-10-20 02:34:47 -07:00
Anthony Bilinski
f72f3f714d
fix(history): handle errors during db upgrade 2019-10-20 02:34:47 -07:00
Anthony Bilinski
dacfcdadac
refactor(history): apply db schema upgrade one version at a time
This allows upgrade steps to query the db at the last version and run C++ code
on the results, then do a single transaction to make the upgrade, instead of
all actions of each upgrade step being required to be part of the overall
upgrade transaction.
2019-10-20 02:34:47 -07:00
Anthony Bilinski
996b17b1d1
refactor(test): allow generic schema creation and verification in for db schema 2019-10-20 02:34:47 -07:00
Jimi Huotari
7f74d41586
refactor(Qt): use 'QLatin1String' instead of 'QLatin1Literal'
This is an undocumented Qt 2/3/4 remnant, deprecated in Qt 5.14.

- https://code.qt.io/cgit/qt/qtbase.git/commit/?h=5.14&id=3e75c296
- https://code.qt.io/cgit/qt/qtbase.git/commit/?h=5.14&id=45373c19
2019-10-09 23:19:26 -07:00
jenli669
04a9bc46f4
docs(copyright): update and add copyright info
zealously updates and adds qTox copyright information.

Fixes #5713
2019-06-28 01:18:26 +02:00
Mick Sayson
e5016337bb refactor(offlinemsg): Decouple OfflineMsgEngine from other components 2019-05-26 15:33:51 -07:00
Anthony Bilinski
316893ace9
test(db): add db schema upgrade test 2019-05-15 13:26:21 -07:00
sudden6
55c361eb71
test(paths): add tests for paths module 2018-11-14 11:02:20 +01:00