4 years agoGnuPG: adding missing files
Stephan Platz [Tue, 3 Dec 2013 22:19:59 +0000 (23:19 +0100)]
GnuPG: adding missing files

4 years agoGnuPG: added support for sending encrypted and signed messages
Stephan Platz [Tue, 3 Dec 2013 22:18:23 +0000 (23:18 +0100)]
GnuPG: added support for sending encrypted and signed messages

4 years agoGnuPG: added settings page for GnuPG support
Stephan Platz [Tue, 3 Dec 2013 22:17:19 +0000 (23:17 +0100)]
GnuPG: added settings page for GnuPG support

4 years agoGnuPG: Migrated to the new way of handling raw message parts and the fetch status
Stephan Platz [Tue, 3 Dec 2013 22:14:21 +0000 (23:14 +0100)]
GnuPG: Migrated to the new way of handling raw message parts and the fetch status

4 years agoAdded CMakeLists.txt.user to .gitignore
Stephan Platz [Tue, 22 Oct 2013 20:22:50 +0000 (22:22 +0200)]
Added CMakeLists.txt.user to .gitignore

4 years agoGnuPG: some more lines that have to be guarded
paalsteek [Mon, 21 Oct 2013 20:19:40 +0000 (22:19 +0200)]
GnuPG: some more lines that have to be guarded

Thanks to cschutijser for testing

4 years agoGnuPG: do not include gpg files when feature disabled
paalsteek [Mon, 21 Oct 2013 19:33:11 +0000 (21:33 +0200)]
GnuPG: do not include gpg files when feature disabled

Thanks to cschutijser for testing

4 years agoGnuPG: some CMake fixes
paalsteek [Mon, 21 Oct 2013 19:28:00 +0000 (21:28 +0200)]
GnuPG: some CMake fixes

4 years agoGnuPG: remove remains of gpgme
paalsteek [Mon, 21 Oct 2013 19:27:12 +0000 (21:27 +0200)]
GnuPG: remove remains of gpgme

4 years agoGnuPG: added MIME parser based on mimetic to parse and display encrypted messages
paalsteek [Sun, 20 Oct 2013 18:37:50 +0000 (20:37 +0200)]
GnuPG: added MIME parser based on mimetic to parse and display encrypted messages

4 years agoGui: moved filteredForEmbedding to PartWidgetFactory to make it accessable for other...
paalsteek [Sun, 20 Oct 2013 17:53:13 +0000 (19:53 +0200)]
Gui: moved filteredForEmbedding to PartWidgetFactory to make it accessable for other PartWidget classes

4 years agoGnuPG: fixed primaryUserId
paalsteek [Sat, 19 Oct 2013 10:35:44 +0000 (12:35 +0200)]
GnuPG: fixed primaryUserId

4 years agoGnuPG: started implementing decryption
paalsteek [Fri, 18 Oct 2013 23:33:18 +0000 (01:33 +0200)]
GnuPG: started implementing decryption

4 years agoGnuPG: primaryUserId is broken for some reason. Do not call it for now
paalsteek [Fri, 18 Oct 2013 23:32:42 +0000 (01:32 +0200)]
GnuPG: primaryUserId is broken for some reason. Do not call it for now

4 years agoGnuPG: translate GnuPG error messages
paalsteek [Fri, 18 Oct 2013 23:17:40 +0000 (01:17 +0200)]
GnuPG: translate GnuPG error messages

4 years agoGnuPG: drop filteredForEmbedding
paalsteek [Fri, 18 Oct 2013 23:15:26 +0000 (01:15 +0200)]
GnuPG: drop filteredForEmbedding

4 years agoGnuPG: restructured OpenPGPView to allow more asynchronous calls
paalsteek [Fri, 18 Oct 2013 22:42:39 +0000 (00:42 +0200)]
GnuPG: restructured OpenPGPView to allow more asynchronous calls

4 years agoGnuPG: license header added
paalsteek [Fri, 18 Oct 2013 22:23:12 +0000 (00:23 +0200)]
GnuPG: license header added

4 years agoGnuPG: wait for message parts to be loaded before attempting to verify a signature
paalsteek [Wed, 16 Oct 2013 23:09:50 +0000 (01:09 +0200)]
GnuPG: wait for message parts to be loaded before attempting to verify a signature

4 years agoGnuPG: replace gpgme with QCA
paalsteek [Wed, 16 Oct 2013 00:15:29 +0000 (02:15 +0200)]
GnuPG: replace gpgme with QCA

4 years agoMoved OpenPGP code to seperate class.
paalsteek [Tue, 15 Oct 2013 21:45:32 +0000 (23:45 +0200)]
Moved OpenPGP code to seperate class.
Added BodyFldParam PROTOCOL identifying the signature protocol for multipart/signed messages

4 years agogpg: first implementation of gpg signature verification support
paalsteek [Mon, 14 Oct 2013 22:06:17 +0000 (00:06 +0200)]
gpg: first implementation of gpg signature verification support

4 years agoAdd missing credits to Benjamin Kaiser
Jan Kundrát [Mon, 2 Dec 2013 01:18:57 +0000 (02:18 +0100)]
Add missing credits to Benjamin Kaiser

4 years agobuild: add options for -Werror to the CI
Jan Kundrát [Mon, 2 Dec 2013 00:44:57 +0000 (01:44 +0100)]
build: add options for -Werror to the CI

When cmake is run with -DDEV_FATAL_WARNINGS=ON, all warnings are turned into
errors. The idea is that Trojita compiles warning-free, and it shall remain so.

This is, however, *not* enabled for the end-user builds because experience of a
ton of other projects shows that sooner or later a compiler will come up with a
new, incompatible diagnostics which simply breaks everything.

4 years agobuild: enable warnings about signed-unsigned compare and fix one problem in tests
Jan Kundrát [Mon, 2 Dec 2013 00:43:10 +0000 (01:43 +0100)]
build: enable warnings about signed-unsigned compare and fix one problem in tests

This is enabled on Qt5 by default, apparently, so it never hurts to have it
always active.

4 years agotree: do not try to insert -1 rows
Jan Kundrát [Mon, 2 Dec 2013 01:08:23 +0000 (02:08 +0100)]
tree: do not try to insert -1 rows

Thanks to the KDE CI infrastructure for catching this -- it is a bug and Qt's
asserts guard against it.

4 years agoIMAP: fix a bug when opening folders when offline after a STATUS arrived
Jan Kundrát [Sat, 30 Nov 2013 15:24:50 +0000 (16:24 +0100)]
IMAP: fix a bug when opening folders when offline after a STATUS arrived

By definition, the mailboxes are synchronized when they are opened. When all
whic his needed is just the number of e.g. unread/total messages, a lightweight
variant of syncing is performed through the STATUS command. The STATUS data are
displayed in the GUI, but they are not cached. Unfortunately, they also managed
to interfere with opening the mailbox from a locally cached copy when offline.

This change makes sure that the only "cache consistency check" which is
performed happens on top of the cached data, i.e. the UID mapping and the
synchronization state. What has in the meanwhile arrived via STATUS is
completely irrelevant and should not affect the synchronization process (we do
not even know whether some messages were deleted, so it is impossible to show
e.g. a couple (status_exists - old_exists) empty placeholder messages, etc).

I guess it's very handy that I travel on train every now and then :).

REVIEW: 114225

4 years agoOther visual changes to attachments
Thomas Lübking [Mon, 19 Aug 2013 22:09:14 +0000 (00:09 +0200)]
Other visual changes to attachments

REVIEW: 114188

4 years agoAdd proper credits for Stephan and Jai
Jan Kundrát [Fri, 29 Nov 2013 22:38:17 +0000 (23:38 +0100)]
Add proper credits for Stephan and Jai

4 years agoSender LineEdit turns red for invalid address.
Jai Luthra [Fri, 29 Nov 2013 11:00:12 +0000 (16:30 +0530)]
Sender LineEdit turns red for invalid address.

4 years agoSender address is editable.
Jai Luthra [Thu, 28 Nov 2013 22:09:10 +0000 (03:39 +0530)]
Sender address is editable.

Free form editing of the FromAddress is possible, and saving/loading drafts
with a custom FromAddress works.

A huge thanks to Stephan Platz (paalsteek) for his patch. This commit is built
upon that very patch.

BUG: 321230

4 years agoIMAP: fix QRESYNC when the mailbox was previously empty
Jan Kundrát [Fri, 29 Nov 2013 00:26:28 +0000 (01:26 +0100)]
IMAP: fix QRESYNC when the mailbox was previously empty

The code must know that QRESYNC was issued, otherwise it (correctly) refuses to
deal with FETCH messages which attempt to reference the "unknown" messages.

Thansk to Stephan Platz (paalsteek on IRC) for an excellent report.

4 years agoGUI: make sure that all actions are reachable even when the menu is hidden
Jan Kundrát [Thu, 28 Nov 2013 16:15:49 +0000 (17:15 +0100)]
GUI: make sure that all actions are reachable even when the menu is hidden

The action has to be added to a visible widget if we want the shortcuts to work.
The menu had an option for hiding for quite some time, but a hidden menu
apparently stops these shortcuts from working. As a workaround, we can easily
add the actions directly to the main widget.

v2: Move the add-action-to-widget code to the place where they're getting added
to the menu, and be sure it's unified into a single macro. Also remove extra
addAction calls where they are not needed.

REVIEW: 114183

4 years agoGUI: Save state of menu bar between launches
Benjamin Kaiser [Thu, 28 Nov 2013 14:09:13 +0000 (01:09 +1100)]
GUI: Save state of menu bar between launches

REVIEW: 114177

4 years agotree: preallocate memory for all TreeItemMessage instances during the mailbox sync
Jan Kundrát [Mon, 25 Nov 2013 22:26:53 +0000 (23:26 +0100)]
tree: preallocate memory for all TreeItemMessage instances during the mailbox sync

There is no measurable performance change on my test setup, which is expected --
the amortized cost of reallocating is still O(1) per element, i.e. O(n) for the
mailbox as a whole, and pointer copying is dwarfed by the overhead of dynamic
allocation of the actual nodes and other useful work, but it's still good style
to preallocate what is known to be needed in future.

Thanks to Thomas Lübking for suggesting this.

REVIEW: 114124

4 years agoClarify that In-Reply-To and References shall not contain the angle brackets
Jan Kundrát [Mon, 25 Nov 2013 10:04:52 +0000 (11:04 +0100)]
Clarify that In-Reply-To and References shall not contain the angle brackets

This is apparently in accordance with RFC 5322, section 3.6.4.

Thanks to Pali for reporting that this could really use some docs.

4 years agoMerge remote-tracking branch 'kde/master'
Jan Kundrát [Mon, 25 Nov 2013 09:36:02 +0000 (10:36 +0100)]
Merge remote-tracking branch 'kde/master'

4 years agoSVN_SILENT made messages (.desktop file)
l10n daemon script [Sun, 24 Nov 2013 04:07:30 +0000 (04:07 +0000)]
SVN_SILENT made messages (.desktop file)

4 years agotree: Use tagged pointers to save memory
Jan Kundrát [Fri, 22 Nov 2013 00:54:20 +0000 (01:54 +0100)]
tree: Use tagged pointers to save memory

This change exploits the fact that the TreeItem structure has to be aligned,
typically to four or 8 bytes. This means that the m_parent cannot ever have the
couple of lowest bits set, so we can merge the m_fetchingState and m_parent into
a single member variable and save memory by that.

REVIEW: 114018

4 years agocmake: add support for the alignof operator from C++11
Jan Kundrát [Fri, 22 Nov 2013 00:50:34 +0000 (01:50 +0100)]
cmake: add support for the alignof operator from C++11

4 years agoSwitch to faster parsing of FETCH responses
Jan Kundrát [Fri, 22 Nov 2013 02:04:45 +0000 (03:04 +0100)]
Switch to faster parsing of FETCH responses

REVIEW: 114015

4 years agoIMAP: speed up the FETCH response parsing
Jan Kundrát [Thu, 21 Nov 2013 21:42:41 +0000 (22:42 +0100)]
IMAP: speed up the FETCH response parsing

Previously, the code would happily hit the LowLevelParser::parseList even on the
top-level level, which is rather expensive. Instead of that, this change parses
the individual data fields separately and takes into account the knowledge of
the expected data type. Furthermore, the order in which these fields are checked
against is changed so that FLAGS, UID and MODSEQ are checked first because these
are going to be the most widely encountered entities during mass-syncing, which
was traditionally the bottleneck.

A high-level measurement: the whole test suite takes 9.5 seconds instead of
11.5, i.e. this is a 17.5% speedup.

4 years agotests: test also compliant FETCH responses
Jan Kundrát [Thu, 21 Nov 2013 22:11:42 +0000 (23:11 +0100)]
tests: test also compliant FETCH responses

Make sure that we also check the case where the "complicated" identifier is
separated from the rest of the data by a single space, as requested by the RFC.

4 years agoDon't include extra headers
Jan Kundrát [Thu, 21 Nov 2013 21:42:12 +0000 (22:42 +0100)]
Don't include extra headers

4 years agotests: simplify the flag building for fake flags
Jan Kundrát [Thu, 21 Nov 2013 21:08:09 +0000 (22:08 +0100)]
tests: simplify the flag building for fake flags

4 years agoDo not use dynamic_cast in inner loops and other hot paths
Jan Kundrát [Thu, 21 Nov 2013 20:35:06 +0000 (21:35 +0100)]
Do not use dynamic_cast in inner loops and other hot paths

There isn't much point in checking the correctness of our internal tree
representation all the time. Rough measurements indicate that one can get
another 1% speedup by switching to static_cast at these places.

REVIEW: 114014

4 years agoUse QVector for TreeItem child management
Jan Kundrát [Fri, 22 Nov 2013 01:57:14 +0000 (02:57 +0100)]
Use QVector for TreeItem child management

This merges a series of commits which try to improve the speed efficiency of
child housekeeping for the in-memory tree which is maintained by the IMAP model.
This is deliberately not squashed into a single commit so that we can later take
a look at which data structure is actually the best one.

Both QVector and std::vector are close contenders; however, in our case QVector
appears to be *slightly* better -- an empty QVector only takes 8 bytes, while an
empty vector takes 24 bytes on my amd64 system. This is a useful optimization on
huge mailboxes as chances are that only a very small subset of messages will be
needed any given time.

std::vector offers slightly better performance, but I'll take the small memeory
saving in this context, I guess.

REVIEW: 114013

4 years agoRevert "tree: switch to std::vector"
Jan Kundrát [Fri, 22 Nov 2013 01:55:21 +0000 (02:55 +0100)]
Revert "tree: switch to std::vector"

Compared to QVector, an empty std::vector takes three times as much space on
amd64 due to the optimization for shared null. That hurts.

This reverts commit 1916c5f1f35d41893aa93b67bc0676da12fd0d71.

4 years agotree: switch to std::vector
Jan Kundrát [Thu, 21 Nov 2013 19:45:19 +0000 (20:45 +0100)]
tree: switch to std::vector

It appears that the performance is very similar to that of the QVector

4 years agotree: Switch to QVector for the list of item children
Jan Kundrát [Thu, 21 Nov 2013 18:41:36 +0000 (19:41 +0100)]
tree: Switch to QVector for the list of item children

Benchmarking the testFlagReSyncBenchmark on top of 10k messages with callgrind
suggests that there's roughly a 0.6% speedup here.

4 years agotree: Abstract away the container type which is used for actual management of children
Jan Kundrát [Thu, 21 Nov 2013 17:59:14 +0000 (18:59 +0100)]
tree: Abstract away the container type which is used for actual management of children

The motivation behind this change is to enable performance measurement of
different containers. This change only abstracts away the actual type behind a
typedef; the container still has to support the Qt-ish way of access, including
remove(T), takeFirst() etc.

An optimization for batch removal/move is included as well (see the
ObtainSynchronizedMailboxTask.cpp). The old code just didn't make much sense.

4 years agotree: only allocate memory for message metadata when actually needed
Jan Kundrát [Sun, 17 Nov 2013 17:24:59 +0000 (18:24 +0100)]
tree: only allocate memory for message metadata when actually needed

Previously, all messages in a mailbox would be allocated as soon as a mailbox
was opened. The data was not being loaded from the cache or fro mthe network,
but the memory was still being consumed. This patch move those data which are
not immediately needed into an auxiliary struct which is only allocated upon the
first request.

This cuts the memory usage of the testFlagReSyncBenchmark to 25 MB from 45 MB of
the old version.

What will be interesting to do is implementing periodical freeing of resources,
so that messages which are "not needed" anymore could be reclaimed. However,
that will require tracking the actual usage patterns of the individual items
which is rather hard to do -- the Qt MVC API unfortunately doesn't help here,
not even when using the persistent indexes.

v2: Release the full MessageDataPayload when freeing the per-message memory.
Thanks to Thomas Lübking for his suggestion, and shame on me for not doing this
in the first place. Train coding apparently didn't work this time.

REVIEW: 113912

4 years agoIMAP: Make sure both the sync state and UID mapping are updated in sync
Jan Kundrát [Fri, 15 Nov 2013 18:47:37 +0000 (19:47 +0100)]
IMAP: Make sure both the sync state and UID mapping are updated in sync

The code was originally modifying the UID mapping and the mailbox sync state
separately and at an undefined time. In addition to that, the HIGHESTMODSEQ,
MODSEQ and RECENT updates were not propagated at certain time, leading to
excessive network traffic even for stuff which was already transferred before.

This change makes sure that we never do crazy stuff like throwing away the UID
mapping while retaining the sync state, or perhaps updating the sync state
before all the UIDs have arrived, etc. The ultimate goal of this patch is that
no data are transferred twice and that the local cache is always kept in a
consistent state.

After this patch is applied, you might see a once-per-folder resynchronization
and a complaint on the stderr about the cache being inconsistent. This means
that some previous session, perhaps an older version of Trojita, has corrupted
the cache and we cannot trust it anymore. That's unavoidable and also a right
thing to do :).

REVIEW: 113891
fixes #457
fixes #458

4 years agoIMAP: Make sure that ENABLE always preceeds SELECT
Jan Kundrát [Fri, 15 Nov 2013 17:43:03 +0000 (18:43 +0100)]
IMAP: Make sure that ENABLE always preceeds SELECT

The tasks were created at the right moment, but they weren't actually started
soon enough.

fixes #611
REVIEW: 113888

4 years agoAdd UI hints and prevent saving a configuration which definitely is not going to...
Jan Kundrát [Fri, 15 Nov 2013 15:51:18 +0000 (16:51 +0100)]
Add UI hints and prevent saving a configuration which definitely is not going to work

v2: Check more fields -- thanks to Caspar for review.

BUG: 324850
REVIEW: 113886

4 years agoRefactoring: use an interface for the common business logic
Jan Kundrát [Fri, 15 Nov 2013 14:00:28 +0000 (15:00 +0100)]
Refactoring: use an interface for the common business logic

The whole reason for the asWidget() method is to enforce the type correctness
here. Any solution which employes a static_cast or a reinterpret_cast is evil,
and one cannot use virtual inheritance with multiple QObject instances due to
the moc's limitations, according to the docs.

4 years agoEnable webkit heuristic for RTL text
Jan Kundrát [Sun, 10 Nov 2013 00:07:32 +0000 (01:07 +0100)]
Enable webkit heuristic for RTL text

This change enables WebKit to employ the standard HTML5/CSS/Unicode heuristics
for determining the text direction of the paragraphs based on their content.

CCBUG: 327321

4 years agoRefactor from QPair<int, QString> into a reasonable structure with named members
Jan Kundrát [Fri, 8 Nov 2013 18:35:47 +0000 (19:35 +0100)]
Refactor from QPair<int, QString> into a reasonable structure with named members

4 years agoalign visible reciepents to splitter
Thomas Lübking [Fri, 8 Nov 2013 21:25:06 +0000 (22:25 +0100)]
align visible reciepents to splitter

BUG: 327195
REVIEW: 113729

4 years agoDebian: add runtime dependency on the sqlite QtSql plugin
Jan Kundrát [Mon, 11 Nov 2013 10:53:52 +0000 (11:53 +0100)]
Debian: add runtime dependency on the sqlite QtSql plugin

Thanks to Pepijn de Vos <> (pepijndevos on IRC) and to
Jonatan Kallus <> for reporting this problem.


4 years agoAdd support for decoding format=flowed delsp=yes
Jan Kundrát [Wed, 6 Nov 2013 16:53:09 +0000 (17:53 +0100)]
Add support for decoding format=flowed delsp=yes

RFC 3676 specifies that these extra spaces in format=flowed shall be eaten when
the DelSp=yes is used.

REVIEW: 113687

4 years agoGUI: Inhibit auto-mark-read after toggling the state manually
Jan Kundrát [Mon, 4 Nov 2013 20:27:27 +0000 (21:27 +0100)]
GUI: Inhibit auto-mark-read after toggling the state manually

The point of this patch is to make sure that a quick press of "M" immediately
after hitting the up/down arrow key will abort the delayed "let's make current
message as read" feature.

This stuff has to be done in a slightly complicated way due to way how shortcuts
are implemented in Qt. The shortcut receives the key information *prior* to the
target widget's keyReleaseEvent; the keyPressEvent is actually eaten by the
QAction's shortcut handler.

However, we can still listen to the QEvent::ShortcutOverride which is processed
prior to QAction. This patch therefore configures the widget so that if it
detects that any other key than those in the "delay any action for these" group
has been pressed, the delay is immediately cut and the action is performed.

On top of that, the actual inhibition of the auto-mark-as-read timer can be
trivially implemented. The ihibiting is only active when the "current message"
as defined by the listing matches the "current message" as defined by the
message viewer.

REVIEW: 113669

4 years agoGUI: Do not toggle the message read/unread on key up/down
Jan Kundrát [Mon, 4 Nov 2013 20:26:10 +0000 (21:26 +0100)]
GUI: Do not toggle the message read/unread on key up/down

If the current column corresponds to the "seen indicator", key up/down would
preserve that column which would cause an unexpected result. This special
behavior shall work only as a result of an explicit mouse click.

REVIEW: 113667

4 years agoAdd a helper function for obtaining the deproxified index
Jan Kundrát [Mon, 4 Nov 2013 20:04:39 +0000 (21:04 +0100)]
Add a helper function for obtaining the deproxified index

It's a pretty common operation throughout the GUI to request a QModelIndex which
points to the lowest-layer model, discounting any proxies. Previously, a helper
function was used for this, but that was rather tedious to use because the
QModelIndex wasn't its return value.

REVIEW: 113668

4 years agoQWebView: prevent repeated resizing of the contents
Jan Kundrát [Fri, 1 Nov 2013 16:54:18 +0000 (17:54 +0100)]
QWebView: prevent repeated resizing of the contents

The call to constrainSize resulted in changing the size of the page contents
which led to constrainSize being called again. We were lucky that there wasn't
an infinite loop.

The reaction to page()->mainFrame()->contentsSizeChanged(QSize) is critical to
remain here because of e.g. the interactive resizing of JPEG images or for
proper loading of complex HTML mail which might refer to, say, other parts via
the CID mechanism.

REVIEW: 113538

4 years agoInclude real credits in the about box and make it prettier
Jan Kundrát [Thu, 31 Oct 2013 20:33:04 +0000 (21:33 +0100)]
Include real credits in the about box and make it prettier

The old about box only had a small icon with no real credits for all
contributors, just a simple link (which did not work because the proper QLabel
link delegation was not active).

The new version adds the LICENSE file with all contributors as a Qt resource and
uses the data at runtime after some transformation to make it better suited for
the about box presentation.

The layout of the UI got changed a bit to better accommodate (IMHO) the changed
amount of information we show.

REVIEW: 113526

4 years agoMerge branch 'bug-326986'
Jan Kundrát [Fri, 1 Nov 2013 12:12:31 +0000 (13:12 +0100)]
Merge branch 'bug-326986'

4 years agoThere is not unsetenv() on MinGW
Jan Kundrát [Fri, 1 Nov 2013 11:25:45 +0000 (12:25 +0100)]
There is not unsetenv() on MinGW

BUG: 326986
REVIEW: 113529

4 years agoHarmattan: Fix cmake and packaging files
Pali Rohár [Thu, 19 Sep 2013 16:11:47 +0000 (18:11 +0200)]
Harmattan: Fix cmake and packaging files

* Use correct CMAKE_INSTALL_PREFIX, so setting CMAKE_INSTALL_RPATH is not needed
* Use correct GNU Make DESTDIR, so absolute paths in cmake install commands are not needed
* Use only one install command for target Plugins (now it is possible because paths are correct)
* Move share files from opt area in debian/rules, so absolute paths in cmake are not needed

REVIEW: 112832

4 years agoUse alphabetical order of these files
Jan Kundrát [Thu, 31 Oct 2013 17:20:37 +0000 (18:20 +0100)]
Use alphabetical order of these files

4 years agoRemove useless file
Jan Kundrát [Thu, 31 Oct 2013 17:18:35 +0000 (18:18 +0100)]
Remove useless file

4 years agoAdd proper credit for 3rd party software we ship
Jan Kundrát [Thu, 31 Oct 2013 10:54:08 +0000 (11:54 +0100)]
Add proper credit for 3rd party software we ship

The quoted-printable & imap-modifieed-utf7 encoders and decoders, the KDE's
proxy models, the ModelTester, the FlowLayout, the mimetypes-qt4 and the
qwwsmtpclient are all shipped as a part of Trojita, so a proper credit must be
mentioned in the "accompanying documentation".

4 years agoGive proper credit to Pali
Jan Kundrát [Thu, 31 Oct 2013 10:40:03 +0000 (11:40 +0100)]
Give proper credit to Pali

4 years agoFlatten the list of copyright holders
Jan Kundrát [Thu, 31 Oct 2013 10:38:50 +0000 (11:38 +0100)]
Flatten the list of copyright holders

It is tricky to judge the amount of work people have done here, so let's strip
out the extra spacing.

4 years agoSupport multiple sessions with separate configuration and cache
Jan Kundrát [Mon, 7 Oct 2013 15:09:48 +0000 (17:09 +0200)]
Support multiple sessions with separate configuration and cache

Thanks to the work Pali did within the GSoC, Trojita no longer constructs a
QSettings instance from multiple places. It is therefore pretty easy to enforce
a separation of some kind between the concurrent sessions. One use case of this
patch is for situations where it's necessary to access multiple IMAP accounts at
once. It's a pretty sucky hack, but it could serve as a stopgap measure until
proper multiaccounts support is written and integrated.

You can test this now via executing trojita with the --profile option like this:

    $ ./trojita --profile work

Of course this patch will cause havoc when support for IPC via DBus is merged
(think mailto: URL handling); that will have to be disabled when a "special
profile" is called. Let's see how well this works for now. Oh, and *please*,
keep the profile name in ASCII; things will break if you don't do so.

For users who do not set a the --profile option, nothing changes and everything
shall work well. It is also safe to run one Trojita instance without any fancy
options and a second one with a custom profile (as long as your profile name
does not match a base64-encoding of some mailbox; please do not do this,

The patch abuses environment variables behind the scenes. I'm not going to put
any more work into this -- the patch is ugly as usual, but this is officially
supposed to be a time-limited hack anyway.

REVIEW: 113150

4 years agoCMake: Fix installing shared plugins
Pali Rohár [Thu, 19 Sep 2013 10:29:50 +0000 (12:29 +0200)]
CMake: Fix installing shared plugins

Do not use absolute path in install command, but relative from new variable
CMAKE_INSTALL_PLUGIN_DIR. Absolute paths in cmake can break packaging.

REVIEW: 112831

4 years agoDisable HTMLification of a too big plaintext
Jan Kundrát [Thu, 24 Oct 2013 15:18:37 +0000 (17:18 +0200)]
Disable HTMLification of a too big plaintext

The current code for turning a plaintext into HTML is very slow on large
payload. Some of the time is spent in actual plaintext parsing and HTML
building, but even the WebKit is fed with the data twice instead of just once.

A proper fix would be to move this transformation outside of the GUI. An obvious
place is a QNetworkReply subclass with some help from the QNetworkAccessManager.
Once this is offloaded, we could even use a separate thread to not block the

See for details.

REVIEW: 113421

4 years agoUse QLatin1String
Jan Kundrát [Thu, 24 Oct 2013 15:15:15 +0000 (17:15 +0200)]
Use QLatin1String

4 years agoCoding style
Jan Kundrát [Thu, 24 Oct 2013 15:14:49 +0000 (17:14 +0200)]
Coding style

4 years agoDo not set the $SubmitPending flag during the initial submission attempt
Jan Kundrát [Wed, 23 Oct 2013 01:24:35 +0000 (03:24 +0200)]
Do not set the $SubmitPending flag during the initial submission attempt

The $SubmitPending IMAP keywords  on its own is meant to indicate that "this
message needs to be sent out" [1]; MUAs are supposed to use both $Submitted and
$SubmitPending when the message is actively submitted, and just $Submitted when
the message was sent.

This is a serious bug -- a reasonable client could very well look at the Sent
mailbox and tell users "Hey, it looks like there's a ton of messages to be sent
in there which were never actually sent. Do you want me to send them now?". We
should have never set this flag without proper support for $Submitted in place,
but this misfeature has been around since mid-2012 :(.

Sorry to all who are affected by this, I haven't realized this implication.


REVIEW: 113396
CCBUG: 321381

4 years agoGUI: remember column sizes automatically
Jan Kundrát [Tue, 22 Oct 2013 14:52:48 +0000 (16:52 +0200)]
GUI: remember column sizes automatically

This would get hit when the user resizes the window or any QSplitter, but it's a
bug that it wasn't saved automatically.

v3: Do not use any extra signals. Thanks to Thomas for review.

REVIEW: 113383

4 years agoGUI: delay the GUI state saving a bit
Jan Kundrát [Tue, 22 Oct 2013 15:11:05 +0000 (17:11 +0200)]
GUI: delay the GUI state saving a bit

When the user moves a slider, resizes a column or something, it's better to
delay the actual save operation a bit so that the changes are compressed. It
isn't that much useful to save each value in a range separately anyway.

4 years agoThis is a commit series which makes it possible to request raw, unprocessed data
Jan Kundrát [Wed, 23 Oct 2013 00:15:27 +0000 (02:15 +0200)]
This is a commit series which makes it possible to request raw, unprocessed data
from the IMAP server. It is needed for signature verification, among other
things, and Trojita's automatic CTE processing interfered with this.

Merge branch 'fetching-raw-parts'

REVIEW: 113375

4 years agotravis: Implement command retries
Jan Kundrát [Tue, 22 Oct 2013 17:28:19 +0000 (19:28 +0200)]
travis: Implement command retries

This is an attempt at ignoring some of the rather common network issues, as
described on the Travis blog.

4 years agoRemove processed data from cache when the raw data are stored
Jan Kundrát [Mon, 21 Oct 2013 22:23:22 +0000 (00:23 +0200)]
Remove processed data from cache when the raw data are stored

The idea is that both base64 and quoted-printable decoding is blazingly fast, so
it makes a lot of sense to conserve space by saving just a single copy on disk.

Note that no checks are made whether both copies of data are actually the same.
We do actively try to catch the server cheating here.

4 years agoCoding style
Jan Kundrát [Mon, 21 Oct 2013 22:16:04 +0000 (00:16 +0200)]
Coding style

4 years agoConst correctness for Cache and its implementations
Jan Kundrát [Mon, 21 Oct 2013 22:14:59 +0000 (00:14 +0200)]
Const correctness for Cache and its implementations

4 years agoImap: distinguish about fetching the processed and unprocessed data
Jan Kundrát [Mon, 21 Oct 2013 21:57:44 +0000 (23:57 +0200)]
Imap: distinguish about fetching the processed and unprocessed data

This patch tries to make sure that the data are not kept twice in memory unless
asked to, and that the data in the on-disk cache are not duplicated.

One choice to make is what to do when we already know the decoded data and ask
for the raw data once again. The paranoid option would be to have a look at the
cached, already-decoded data and check whether what we have now matches. The
code will, however, simply leave the older data around and neither check nor
overwrite them with the locally decoded copy.

4 years agomoved decodeTransportEncoding to Encoders to make it accessable for other classes
Stephan Platz [Sun, 20 Oct 2013 17:56:57 +0000 (19:56 +0200)]
moved decodeTransportEncoding to Encoders to make it accessable for other classes

4 years agoIMAP: Implement fetching of raw part data without the CTE decoding
Jan Kundrát [Mon, 21 Oct 2013 21:01:31 +0000 (23:01 +0200)]
IMAP: Implement fetching of raw part data without the CTE decoding

Certain applications, most notably support for signature verification, requires
access to raw, unprocessed part data as returned by the IMAP server. Trojita,
however, is happy to utilize the BINARY extension and stores the data in the
already decoded form.

This patch adds a new special tree item, the OFFSET_RAW_CONTENTS. When accessed,
a request for raw data is made, the result is stored in an appropriate cache
entry and the data are also made available to the "regular" part.

4 years agoRemove a couple of obsolete FIXMEs
Jan Kundrát [Mon, 21 Oct 2013 19:41:59 +0000 (21:41 +0200)]
Remove a couple of obsolete FIXMEs

The parts are loaded in batches already by the mailbox keeping task. Also, the
TreeItemPart::fetch and TreeItemPart::fetchFromCache will not trigger the part
load unless the UID is already known, so there's no potential for a remotly
triggerable assert crash here.

4 years agoOnly call the dynamic_cast when asserts are enabled
Jan Kundrát [Mon, 21 Oct 2013 19:21:41 +0000 (21:21 +0200)]
Only call the dynamic_cast when asserts are enabled

4 years agoBetter checks of the part paths
Jan Kundrát [Mon, 21 Oct 2013 18:36:48 +0000 (20:36 +0200)]
Better checks of the part paths

Let's immediately return a nullptr in case the textual special part identifier
points to some garbage.

Also be sure to check that there are no extra chunks in our location after the
special parts is found. The old version would exit the loop unconditionally,
which is not the right thing to do. We want to return a nullptr on e.g. /TEXT/0,
not treat that as /TEXT.

4 years agoSimplify the code for finding parts via their path
Jan Kundrát [Mon, 21 Oct 2013 18:35:39 +0000 (20:35 +0200)]
Simplify the code for finding parts via their path

The assert was not terribly useful anyway.

4 years agoFix a typo in the comment
Jan Kundrát [Mon, 21 Oct 2013 18:30:44 +0000 (20:30 +0200)]
Fix a typo in the comment

4 years agowww: prettify the download link on the homepage
Jan Kundrát [Sat, 19 Oct 2013 11:38:09 +0000 (13:38 +0200)]
www: prettify the download link on the homepage

4 years agowww: there are Windows installers now
Jan Kundrát [Sat, 19 Oct 2013 11:37:04 +0000 (13:37 +0200)]
www: there are Windows installers now

Thanks to Thanks to Stephan Bosch (S[r]us on IRC) for reporting.

4 years agoIgnore duplicate QWebView::loadStarted events
Jan Kundrát [Thu, 17 Oct 2013 16:18:00 +0000 (18:18 +0200)]
Ignore duplicate QWebView::loadStarted events

It looks like certain messages like those from Mike Cardwell's Email Privacy
Tester cause WebKit to emit duplicate loadStarted() signals without the matching
loadFinished(). This in turn confuses our logic which mistakenly assumes that
for each loadStarted(), there will always be a matching loadFinished() as well.

And as a reminder, the reason why there's a set of items is because a single
message might consist of multiple individual parts and each of them is loaded

Thanks to Mike for reporting this.

REVIEW: 113308

4 years agoMerge branch 'ui-multipart'
Jan Kundrát [Thu, 17 Oct 2013 12:31:24 +0000 (14:31 +0200)]
Merge branch 'ui-multipart'

REVIEW: 113259
REVIEW: 113291

4 years agocoding style: rely on C++11 rules for >>
Jan Kundrát [Thu, 17 Oct 2013 12:30:04 +0000 (14:30 +0200)]
coding style: rely on C++11 rules for >>

Thanks to Caspar for mentioning this in the review; there's no need not to rely
on these now that we require a C++11 compiler.