Add external account secret store API

This commit is contained in:
Mario Fetka
2026-07-16 14:39:14 +02:00
parent 41c6553f37
commit f126a9e0b8
3 changed files with 70 additions and 0 deletions
@@ -1,5 +1,13 @@
PRAGMA foreign_keys = ON;
CREATE TABLE IF NOT EXISTS external_account_secrets (
id TEXT PRIMARY KEY,
owner TEXT NOT NULL,
secret TEXT NOT NULL,
created_at INTEGER NOT NULL,
updated_at INTEGER NOT NULL
);
CREATE TABLE IF NOT EXISTS external_accounts (
id INTEGER PRIMARY KEY,
owner TEXT NOT NULL,
+57
View File
@@ -152,3 +152,60 @@ CollectorAccountsMarkResult(sqlite3 *database, sqlite3_int64 id, long now,
sqlite3_finalize(statement);
return result ? 0 : -1;
}
int
CollectorAccountsSecretSet(sqlite3 *database, const char *id,
const char *owner, const char *secret, long now)
{
sqlite3_stmt *statement = NULL;
const char query[] = "INSERT INTO external_account_secrets "
"(id, owner, secret, created_at, updated_at) VALUES (?, ?, ?, ?, ?) "
"ON CONFLICT(id) DO UPDATE SET owner=excluded.owner, secret=excluded.secret, "
"updated_at=excluded.updated_at";
int result;
if (database == NULL || id == NULL || owner == NULL || secret == NULL ||
sqlite3_prepare_v2(database, query, -1, &statement, NULL) != SQLITE_OK) return -1;
sqlite3_bind_text(statement, 1, id, -1, SQLITE_TRANSIENT);
sqlite3_bind_text(statement, 2, owner, -1, SQLITE_TRANSIENT);
sqlite3_bind_text(statement, 3, secret, -1, SQLITE_TRANSIENT);
sqlite3_bind_int64(statement, 4, (sqlite3_int64) now);
sqlite3_bind_int64(statement, 5, (sqlite3_int64) now);
result = sqlite3_step(statement) == SQLITE_DONE ? 0 : -1;
sqlite3_finalize(statement);
return result;
}
int
CollectorAccountsSecretGet(sqlite3 *database, const char *id,
char *secret, size_t secret_size)
{
sqlite3_stmt *statement = NULL;
const char query[] = "SELECT secret FROM external_account_secrets WHERE id = ?";
int result;
if (database == NULL || id == NULL || secret == NULL || secret_size == 0 ||
sqlite3_prepare_v2(database, query, -1, &statement, NULL) != SQLITE_OK) return -1;
secret[0] = '\0';
sqlite3_bind_text(statement, 1, id, -1, SQLITE_TRANSIENT);
result = sqlite3_step(statement);
if (result == SQLITE_ROW) {
const char *value = (const char *) sqlite3_column_text(statement, 0);
if (value == NULL || snprintf(secret, secret_size, "%s", value) >= (int) secret_size) result = -1;
else result = 1;
} else if (result == SQLITE_DONE) result = 0;
else result = -1;
sqlite3_finalize(statement);
return result;
}
int
CollectorAccountsSecretDelete(sqlite3 *database, const char *id)
{
sqlite3_stmt *statement = NULL;
const char query[] = "DELETE FROM external_account_secrets WHERE id = ?";
int result;
if (database == NULL || id == NULL || sqlite3_prepare_v2(database, query, -1, &statement, NULL) != SQLITE_OK) return -1;
sqlite3_bind_text(statement, 1, id, -1, SQLITE_TRANSIENT);
result = sqlite3_step(statement) == SQLITE_DONE ? 0 : -1;
sqlite3_finalize(statement);
return result;
}
+5
View File
@@ -26,5 +26,10 @@ int CollectorAccountsNextDue(sqlite3 *database, long now,
CollectorExternalAccount *account);
int CollectorAccountsMarkResult(sqlite3 *database, sqlite3_int64 id,
long now, int success, const char *error);
int CollectorAccountsSecretSet(sqlite3 *database, const char *id,
const char *owner, const char *secret, long now);
int CollectorAccountsSecretGet(sqlite3 *database, const char *id,
char *secret, size_t secret_size);
int CollectorAccountsSecretDelete(sqlite3 *database, const char *id);
#endif