mirror of
https://github.com/servalproject/serval-dna.git
synced 2024-12-21 06:03:12 +00:00
Don't check for duplicates if an existing id has been supplied
This commit is contained in:
parent
66deb575d3
commit
2967d1e00f
@ -202,14 +202,19 @@ int rhizome_manifest_bind_id(rhizome_manifest *m_in)
|
||||
}
|
||||
|
||||
/* Check if a manifest is already stored for the same payload with the same details.
|
||||
This catches the case of "dna rhizome add file <filename>" on the same file more than once.
|
||||
This catches the case of "rhizome add file <filename>" on the same file more than once.
|
||||
(Debounce!) */
|
||||
int rhizome_manifest_check_duplicate(rhizome_manifest *m_in, rhizome_manifest **m_out)
|
||||
{
|
||||
// if a manifest was supplied with an ID, don't bother to check for a duplicate.
|
||||
// we only want to filter out added files with no existing manifest.
|
||||
if (m_in->haveSecret!=NEW_BUNDLE_ID)
|
||||
return 0;
|
||||
|
||||
if (config.debug.rhizome) DEBUG("Checking for duplicate");
|
||||
if (m_out) *m_out = NULL;
|
||||
rhizome_manifest *dupm = NULL;
|
||||
if (rhizome_find_duplicate(m_in, &dupm,0 /* version doesn't matter */) == -1)
|
||||
if (rhizome_find_duplicate(m_in, &dupm) == -1)
|
||||
return WHY("Errors encountered searching for duplicate manifest");
|
||||
if (dupm) {
|
||||
/* If the caller wants the duplicate manifest, it must be finalised, otherwise discarded. */
|
||||
|
@ -73,6 +73,9 @@ extern time_ms_t rhizome_voice_timeout;
|
||||
|
||||
#define RHIZOME_IDLE_TIMEOUT 10000
|
||||
|
||||
#define EXISTING_BUNDLE_ID 1
|
||||
#define NEW_BUNDLE_ID 2
|
||||
|
||||
typedef struct rhizome_signature {
|
||||
unsigned char signature[crypto_sign_edwards25519sha512batch_BYTES
|
||||
+crypto_sign_edwards25519sha512batch_PUBLICKEYBYTES+1];
|
||||
@ -298,8 +301,7 @@ int _sqlite_exec_strbuf(struct __sourceloc, strbuf sb, const char *sqlformat,...
|
||||
double rhizome_manifest_get_double(rhizome_manifest *m,char *var,double default_value);
|
||||
int rhizome_manifest_extract_signature(rhizome_manifest *m,int *ofs);
|
||||
int rhizome_update_file_priority(const char *fileid);
|
||||
int rhizome_find_duplicate(const rhizome_manifest *m, rhizome_manifest **found,
|
||||
int checkVersionP);
|
||||
int rhizome_find_duplicate(const rhizome_manifest *m, rhizome_manifest **found);
|
||||
int rhizome_manifest_to_bar(rhizome_manifest *m,unsigned char *bar);
|
||||
long long rhizome_bar_version(unsigned char *bar);
|
||||
unsigned long long rhizome_bar_bidprefix_ll(unsigned char *bar);
|
||||
|
@ -644,12 +644,8 @@ int rhizome_manifest_dump(rhizome_manifest *m, const char *msg)
|
||||
|
||||
int rhizome_manifest_finalise(rhizome_manifest *m, rhizome_manifest **mout)
|
||||
{
|
||||
/* Add the manifest and its associated file to the Rhizome database,
|
||||
generating an "id" in the process.
|
||||
PGS @20121003 - Hang on, didn't we create the ID above? Presumably the
|
||||
following does NOT in fact generate a bundle ID.
|
||||
*/
|
||||
int ret=0;
|
||||
|
||||
if (rhizome_manifest_check_duplicate(m, mout) == 2) {
|
||||
/* duplicate found -- verify it so that we can write it out later */
|
||||
rhizome_manifest_verify(*mout);
|
||||
|
@ -34,7 +34,7 @@ unsigned char *rhizome_bundle_shared_secret(rhizome_manifest *m)
|
||||
|
||||
int rhizome_manifest_createid(rhizome_manifest *m)
|
||||
{
|
||||
m->haveSecret=1;
|
||||
m->haveSecret=NEW_BUNDLE_ID;
|
||||
int r=crypto_sign_edwards25519sha512batch_keypair(m->cryptoSignPublic,m->cryptoSignSecret);
|
||||
if (!r) return 0;
|
||||
return WHY("Failed to create keypair for manifest ID.");
|
||||
@ -225,7 +225,7 @@ int rhizome_extract_privatekey(rhizome_manifest *m)
|
||||
bkBytes,m->cryptoSignSecret);
|
||||
|
||||
if (result == 0) {
|
||||
m->haveSecret=1;
|
||||
m->haveSecret=EXISTING_BUNDLE_ID;
|
||||
RETURN(0); // bingo
|
||||
}
|
||||
memset(m->cryptoSignSecret, 0, sizeof m->cryptoSignSecret);
|
||||
@ -275,7 +275,7 @@ int rhizome_find_bundle_author(rhizome_manifest *m)
|
||||
if (!rhizome_bk2secret(m,m->cryptoSignPublic,rs,rs_len,
|
||||
bkBytes,m->cryptoSignSecret)) {
|
||||
memcpy(m->author, authorSid, sizeof m->author);
|
||||
m->haveSecret=1;
|
||||
m->haveSecret=EXISTING_BUNDLE_ID;
|
||||
if (config.debug.rhizome)
|
||||
DEBUGF("found bundle author sid=%s", alloca_tohex_sid(m->author));
|
||||
|
||||
@ -333,8 +333,8 @@ int rhizome_verify_bundle_privatekey(rhizome_manifest *m,
|
||||
if (config.debug.rhizome)
|
||||
DEBUGF("We have the private key for this bundle.");
|
||||
if (m&&sk==m->cryptoSignSecret&&pkin==m->cryptoSignPublic) {
|
||||
DEBUGF("Set haveSecret=1 in manifest");
|
||||
m->haveSecret=1;
|
||||
DEBUGF("Set haveSecret=%d in manifest",EXISTING_BUNDLE_ID);
|
||||
m->haveSecret=EXISTING_BUNDLE_ID;
|
||||
}
|
||||
RETURN(0);
|
||||
}
|
||||
|
@ -1032,8 +1032,10 @@ int rhizome_update_file_priority(const char *fileid)
|
||||
|
||||
@author Andrew Bettison <andrew@servalproject.com>
|
||||
*/
|
||||
int rhizome_find_duplicate(const rhizome_manifest *m, rhizome_manifest **found, int checkVersionP)
|
||||
int rhizome_find_duplicate(const rhizome_manifest *m, rhizome_manifest **found)
|
||||
{
|
||||
// TODO, add service, name, sender & recipient to manifests table so we can simply query them.
|
||||
|
||||
const char *service = rhizome_manifest_get(m, "service", NULL, 0);
|
||||
const char *name = NULL;
|
||||
const char *sender = NULL;
|
||||
@ -1058,8 +1060,6 @@ int rhizome_find_duplicate(const rhizome_manifest *m, rhizome_manifest **found,
|
||||
strbuf_puts(b, "filehash = ?");
|
||||
} else
|
||||
strbuf_puts(b, "filesize = 0");
|
||||
if (checkVersionP)
|
||||
strbuf_puts(b, " AND version = ?");
|
||||
if (strbuf_overrun(b))
|
||||
return WHYF("SQL command too long: %s", strbuf_str(b));
|
||||
int ret = 0;
|
||||
@ -1076,8 +1076,6 @@ int rhizome_find_duplicate(const rhizome_manifest *m, rhizome_manifest **found,
|
||||
DEBUGF("filehash=\"%s\"", filehash);
|
||||
sqlite3_bind_text(statement, field++, filehash, -1, SQLITE_STATIC);
|
||||
}
|
||||
if (checkVersionP)
|
||||
sqlite3_bind_int64(statement, field++, m->version);
|
||||
size_t rows = 0;
|
||||
while (sqlite_step_retry(&retry, statement) == SQLITE_ROW) {
|
||||
++rows;
|
||||
@ -1128,7 +1126,7 @@ int rhizome_find_duplicate(const rhizome_manifest *m, rhizome_manifest **found,
|
||||
WARNF("MANIFESTS row id=%s has inconsistent blob with id=%s -- skipped", q_manifestid, blob_id);
|
||||
++inconsistent;
|
||||
}
|
||||
if (checkVersionP && blob_version != q_version) {
|
||||
if (blob_version != q_version) {
|
||||
WARNF("MANIFESTS row id=%s has inconsistent blob: manifests.version=%lld, blob.version=%lld -- skipped",
|
||||
q_manifestid, q_version, blob_version);
|
||||
++inconsistent;
|
||||
@ -1151,10 +1149,6 @@ int rhizome_find_duplicate(const rhizome_manifest *m, rhizome_manifest **found,
|
||||
++inconsistent;
|
||||
}
|
||||
}
|
||||
if (checkVersionP && q_version != m->version) {
|
||||
WARNF("SELECT query with version=%lld returned incorrect row: manifests.version=%lld -- skipped", m->version, q_version);
|
||||
++inconsistent;
|
||||
}
|
||||
if (blob_service == NULL) {
|
||||
WARNF("MANIFESTS row id=%s has blob with no 'service' -- skipped", q_manifestid, blob_id);
|
||||
++inconsistent;
|
||||
|
@ -305,6 +305,8 @@ int rhizome_manifest_version_cache_lookup(rhizome_manifest *m)
|
||||
str_toupper_inplace(id);
|
||||
m->version = rhizome_manifest_get_ll(m, "version");
|
||||
|
||||
// TODO, work out why the cache was failing and fix it, then prove that it is faster than accessing the database.
|
||||
|
||||
// skip the cache for now
|
||||
long long dbVersion = -1;
|
||||
if (sqlite_exec_int64(&dbVersion, "SELECT version FROM MANIFESTS WHERE id='%s';", id) == -1)
|
||||
|
Loading…
Reference in New Issue
Block a user