The download now no longer checks the http status as some sites return
203, which indicates the result MAY be correct.
We now just check correctness by comparing the hash.
This means that when the node registers a new block has appeared, we'll
instantly download it and check for bcmr data.
This allows the tool to keep running until the moment a block with the
wanted signature is detected.
The BCMR has as the key the date, and we sort the "sources": list
based on that date.
But if the bcmr didn't properly format the date, the missorted
the item.
We now detect this and fall back to block height based sorting.
A BCMR issued through a transaction on the auth-chain is more powerful
if the json links back to that authchain (by base id: authbase).
As such it helps if we have then entire chain of transactions that make
up the authbase downloaded when the processor tries to determine trust.
* move some code to Utils
* add option on downloadjob to mark the error on a different path
* make downloading that fails store the error in the in dir instead of
the output dir since the latter goes to the webserver.
* Add a new app to download missing transactions that make up the
authchain.
* Make the Fetcher create an ini file for each transaction with the
block timestamp it came from.
* Make the processor sorting use the block it was announced in as a tie-
breaker when the author of the json stupidly used the exact same data
for multiple revisions.
* bugfixes.
Softlinks are hard to setup, as you need a relative path from one to the
other. Its messy..
So, make use of hard links instead and since the Qt APIs don't support
that, just call the standard library (libc) support for this. (still
posix 2008, in case you wonder).
It would try to download again on a next iteration unless we create the
file. So create it with the error code and it is short enough for the
main process to ignore the file.
The registry and the authbase ids are now checked to be (lowercase)
hexadecimal strings.
There were various out there that put whitespace in there, one even
was an empty string!