.clang-format
.clang-tidy
.gitignore
.vimrc
BrowserTab.cpp
BrowserTab.h
BrowserView.cpp
BrowserView.h
CMakeLists.txt
DatabaseManager.cpp
DatabaseManager.h
DownloadBar.cpp
DownloadBar.h
DownloadWidget.cpp
DownloadWidget.h
MainWindow.cpp
MainWindow.h
Makefile
MasterPasswordDialog.cpp
MasterPasswordDialog.h
PasswordHelper.cpp
PasswordHelper.h
README.md
ThemeConfig.h
VaultManager.cpp
VaultManager.h
browser.desktop
browser.qrc
compile_commands.json
main.cpp
DatabaseManager.cpp
raw
1#include "DatabaseManager.h"
2
3bool DatabaseManager::init() {
4 QString path = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation);
5 QDir().mkpath(path);
6
7 db = QSqlDatabase::addDatabase("QSQLITE");
8 db.setDatabaseName(path + "/browser.db");
9
10 if (!db.open()) {
11 qDebug() << "Error: connection with database failed" << db.lastError();
12 return false;
13 }
14
15 return createTables();
16}
17
18bool DatabaseManager::createTables() {
19 QSqlQuery query;
20
21 // History
22 if (!query.exec("CREATE TABLE IF NOT EXISTS history ("
23 "id INTEGER PRIMARY KEY AUTOINCREMENT, "
24 "url TEXT, "
25 "title TEXT, "
26 "last_visit DATETIME)")) {
27 qDebug() << "Error creating history table:" << query.lastError();
28 return false;
29 }
30
31 // Bookmarks
32 if (!query.exec("CREATE TABLE IF NOT EXISTS bookmarks ("
33 "id INTEGER PRIMARY KEY AUTOINCREMENT, "
34 "url TEXT UNIQUE, "
35 "title TEXT, "
36 "created_at DATETIME)")) {
37 qDebug() << "Error creating bookmarks table:" << query.lastError();
38 return false;
39 }
40
41 // Vault Meta
42 if (!query.exec("CREATE TABLE IF NOT EXISTS vault_meta ("
43 "key TEXT PRIMARY KEY, "
44 "value BLOB NOT NULL)")) {
45 qDebug() << "Error creating vault_meta table:" << query.lastError();
46 return false;
47 }
48
49 // Passwords
50 if (!query.exec("CREATE TABLE IF NOT EXISTS passwords ("
51 "id INTEGER PRIMARY KEY AUTOINCREMENT, "
52 "origin TEXT NOT NULL, "
53 "username TEXT NOT NULL, "
54 "password_ciphertext BLOB NOT NULL, "
55 "password_nonce BLOB NOT NULL, "
56 "created_at DATETIME NOT NULL, "
57 "updated_at DATETIME NOT NULL)")) {
58 qDebug() << "Error creating passwords table:" << query.lastError();
59 return false;
60 }
61
62 // Domain settings (extensible key-value per domain)
63 if (!query.exec("CREATE TABLE IF NOT EXISTS domain_settings ("
64 "domain TEXT NOT NULL, "
65 "key TEXT NOT NULL, "
66 "value TEXT, "
67 "PRIMARY KEY (domain, key))")) {
68 qDebug() << "Error creating domain_settings table:" << query.lastError();
69 return false;
70 }
71
72 return true;
73}
74
75void DatabaseManager::addHistoryEntry(const QString &url, const QString &title) {
76 if (url.isEmpty() || url == "about:blank") {
77 return;
78 }
79
80 QSqlQuery query;
81 query.prepare("INSERT INTO history (url, title, last_visit) VALUES (?, ?, ?)");
82 query.addBindValue(url);
83 query.addBindValue(title);
84 query.addBindValue(QDateTime::currentDateTime());
85 query.exec();
86}
87
88void DatabaseManager::addBookmark(const QString &url, const QString &title) {
89 QSqlQuery query;
90 query.prepare(
91 "INSERT OR REPLACE INTO bookmarks (url, title, created_at) "
92 "VALUES (?, ?, ?)");
93 query.addBindValue(url);
94 query.addBindValue(title);
95 query.addBindValue(QDateTime::currentDateTime());
96 query.exec();
97}
98
99bool DatabaseManager::isBookmarked(const QString &url) {
100 QSqlQuery query;
101 query.prepare("SELECT 1 FROM bookmarks WHERE url = ?");
102 query.addBindValue(url);
103 query.exec();
104 return query.next();
105}
106
107void DatabaseManager::removeBookmark(const QString &url) {
108 QSqlQuery query;
109 query.prepare("DELETE FROM bookmarks WHERE url = ?");
110 query.addBindValue(url);
111 query.exec();
112}
113
114QSqlQuery DatabaseManager::executeQuery(const QString &queryStr) {
115 QSqlQuery query;
116 query.exec(queryStr);
117 return query;
118}
119
120bool DatabaseManager::setVaultMeta(const QString &key, const QByteArray &value) {
121 QSqlQuery query;
122 query.prepare("INSERT OR REPLACE INTO vault_meta (key, value) VALUES (?, ?)");
123 query.addBindValue(key);
124 query.addBindValue(value);
125 return query.exec();
126}
127
128QByteArray DatabaseManager::getVaultMeta(const QString &key) {
129 QSqlQuery query;
130 query.prepare("SELECT value FROM vault_meta WHERE key = ?");
131 query.addBindValue(key);
132 if (query.exec() && query.next()) {
133 return query.value(0).toByteArray();
134 }
135 return QByteArray();
136}
137
138void DatabaseManager::setDomainSetting(const QString &domain, const QString &key, const QString &value) {
139 if (domain.isEmpty()) {
140 return;
141 }
142 QSqlQuery query;
143 query.prepare(
144 "INSERT OR REPLACE INTO domain_settings (domain, key, value) "
145 "VALUES (?, ?, ?)");
146 query.addBindValue(domain);
147 query.addBindValue(key);
148 query.addBindValue(value);
149 query.exec();
150 qDebug() << "Domain setting saved:" << domain << key << value;
151}
152
153QString DatabaseManager::getDomainSetting(const QString &domain, const QString &key, const QString &defaultValue) {
154 if (domain.isEmpty()) {
155 return defaultValue;
156 }
157 QSqlQuery query;
158 query.prepare("SELECT value FROM domain_settings WHERE domain = ? AND key = ?");
159 query.addBindValue(domain);
160 query.addBindValue(key);
161 if (query.exec() && query.next()) {
162 return query.value(0).toString();
163 }
164 return defaultValue;
165}