security: Zufallspasswörter beim Erststart, kryptographisch sichere JTI-Generierung

- seedDefaultUsers: generiert kryptographisch zufällige Passwörter (crypto/rand)
  statt hartkodiertes "archivmailrockz" — Passwörter werden einmalig im Terminal
  angezeigt und können danach nicht wiederhergestellt werden
- generateJTI: verwendet crypto/rand (16 Byte, hex) statt time.UnixNano XOR deadbeef

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
sysops
2026-03-17 01:19:24 +01:00
parent 7e165c8eed
commit bb963a796f
25 changed files with 471 additions and 111 deletions
+27 -3
View File
@@ -44,7 +44,7 @@ void xapian_close(XapianDB* db) {
int xapian_index(XapianDB* db, const char* id, const char* from,
const char* to, const char* subject, const char* body,
long long timestamp, char** err) {
long long timestamp, int has_attachment, char** err) {
try {
Xapian::Document doc;
Xapian::TermGenerator gen;
@@ -65,6 +65,11 @@ int xapian_index(XapianDB* db, const char* id, const char* from,
gen.increase_termpos();
gen.index_text(to);
// Boolean term for attachment filter
if (has_attachment) {
doc.add_boolean_term("XHA");
}
// Store timestamp for date range queries (value slot 0)
doc.add_value(0, Xapian::sortable_serialise((double)timestamp));
@@ -96,7 +101,9 @@ char* xapian_search(XapianDB* db, const char* query_str,
const char* from_filter, const char* own_email,
const char* to_filter,
long long date_from, long long date_to,
int offset, int limit, char** err) {
int offset, int limit,
int sort_mode, int has_attachment,
char** err) {
try {
Xapian::Database& xdb = db->wdb ? (Xapian::Database&)*db->wdb : *db->rdb;
Xapian::Enquire enquire(xdb);
@@ -159,8 +166,25 @@ char* xapian_search(XapianDB* db, const char* query_str,
main_query = Xapian::Query(Xapian::Query::OP_AND, main_query, drq);
}
// Attachment filter
if (has_attachment == 1) {
Xapian::Query aq("XHA");
main_query = Xapian::Query(Xapian::Query::OP_AND, main_query, aq);
} else if (has_attachment == -1) {
Xapian::Query aq("XHA");
main_query = Xapian::Query(Xapian::Query::OP_AND_NOT, main_query, aq);
}
enquire.set_query(main_query);
enquire.set_sort_by_value(0, true); // sort by date desc
// Sort mode: 0=relevance, 1=date_desc, 2=date_asc
if (sort_mode == 2) {
enquire.set_sort_by_value(0, false); // date ascending
} else if (sort_mode == 0 && query_str && query_str[0] != '\0') {
// relevance: default BM25 ranking (no explicit sort)
} else {
enquire.set_sort_by_value(0, true); // date descending (default)
}
// Get total count
Xapian::MSet all = enquire.get_mset(0, xdb.get_doccount());