mirror of
https://github.com/servalproject/serval-dna.git
synced 2024-12-30 09:58:55 +00:00
updating manifests now correctly removes old files and old
versions of the manifest. group subscriptions not yet implemented, and reading of signatures not yet implemented. Controls on group membership and pushing files to groups not yet implemented. Group ciphers not yet implemented.
This commit is contained in:
parent
745cade469
commit
a159edf152
71
rhizome.c
71
rhizome.c
@ -53,7 +53,7 @@ int rhizome_opendb()
|
|||||||
fprintf(stderr,"SQLite could enable incremental vacuuming: %s\n",sqlite3_errmsg(rhizome_db));
|
fprintf(stderr,"SQLite could enable incremental vacuuming: %s\n",sqlite3_errmsg(rhizome_db));
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
if (sqlite3_exec(rhizome_db,"CREATE TABLE IF NOT EXISTS GROUPLIST(id text not null primary key, closed integer,ciphered integer);",NULL,NULL,NULL))
|
if (sqlite3_exec(rhizome_db,"CREATE TABLE IF NOT EXISTS GROUPLIST(id text not null primary key, closed integer,ciphered integer,priority integer);",NULL,NULL,NULL))
|
||||||
{
|
{
|
||||||
fprintf(stderr,"SQLite could not create GROUPLIST table: %s\n",sqlite3_errmsg(rhizome_db));
|
fprintf(stderr,"SQLite could not create GROUPLIST table: %s\n",sqlite3_errmsg(rhizome_db));
|
||||||
exit(1);
|
exit(1);
|
||||||
@ -683,6 +683,22 @@ int rhizome_find_keypair_bytes(unsigned char *p,unsigned char *s) {
|
|||||||
return WHY("Could not find matching secret key.");
|
return WHY("Could not find matching secret key.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int rhizome_update_file_priority(char *fileid)
|
||||||
|
{
|
||||||
|
/* Drop if no references */
|
||||||
|
int referrers=sqlite_exec_int64("SELECT COUNT(*) FROM FILEMANIFESTS WHERE fileid='%s';",fileid);
|
||||||
|
if (referrers==0)
|
||||||
|
rhizome_drop_stored_file(fileid,RHIZOME_PRIORITY_HIGHEST+1);
|
||||||
|
if (referrers>0) {
|
||||||
|
/* It has referrers, so workout the highest priority of any referrer */
|
||||||
|
int highestPriority=sqlite_exec_int64("SELECT max(grouplist.priority) FROM MANIFESTS,FILEMANIFESTS,GROUPMEMBERSHIPS,GROUPLIST where manifests.id=filemanifests.manifestid AND groupmemberships.manifestid=manifests.id AND groupmemberships.groupid=grouplist.id AND filemanifests.fileid='%s';",fileid);
|
||||||
|
if (highestPriority>=0)
|
||||||
|
sqlite_exec_int64("UPDATE files set highestPriority=%d WHERE id='%s';",
|
||||||
|
highestPriority,fileid);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Store the specified manifest into the sqlite database.
|
Store the specified manifest into the sqlite database.
|
||||||
We assume that sufficient space has been made for us.
|
We assume that sufficient space has been made for us.
|
||||||
@ -709,26 +725,49 @@ int rhizome_store_bundle(rhizome_manifest *m,char *associated_filename)
|
|||||||
char sqlcmd[1024];
|
char sqlcmd[1024];
|
||||||
const char *cmdtail;
|
const char *cmdtail;
|
||||||
|
|
||||||
|
char *manifestid=rhizome_bytes_to_hex(m->cryptoSignPublic,crypto_sign_edwards25519sha512batch_PUBLICKEYBYTES);
|
||||||
|
|
||||||
if (!m->finalised) return WHY("Manifest was not finalised");
|
if (!m->finalised) return WHY("Manifest was not finalised");
|
||||||
|
|
||||||
/* remove any old version of the manifest */
|
/* remove any old version of the manifest */
|
||||||
if (sqlite_exec_int64("SELECT COUNT(*) MANIFESTS WHERE id='%s';",
|
if (sqlite_exec_int64("SELECT COUNT(*) FROM MANIFESTS WHERE id='%s';",manifestid)>0)
|
||||||
rhizome_bytes_to_hex(m->cryptoSignPublic,crypto_sign_edwards25519sha512batch_PUBLICKEYBYTES))>0)
|
|
||||||
{
|
{
|
||||||
/* Manifest already exists.
|
/* Manifest already exists.
|
||||||
Remove old manifest entry, and replace with new one.
|
Remove old manifest entry, and replace with new one.
|
||||||
But we do need to check if the file referenced by the old one is still needed,
|
But we do need to check if the file referenced by the old one is still needed,
|
||||||
and if it's priority is right */
|
and if it's priority is right */
|
||||||
sqlite_exec_int64("DELETE FROM MANIFESTS WHERE id='%s';",
|
sqlite_exec_int64("DELETE FROM MANIFESTS WHERE id='%s';",manifestid);
|
||||||
rhizome_bytes_to_hex(m->cryptoSignPublic,crypto_sign_edwards25519sha512batch_PUBLICKEYBYTES));
|
|
||||||
WHY("Need to examine the manifestfiles row for the deleted entry (id still matches, so we can find it, and see if it is still needed, or if its priority has changed). Then delete the old manifestfiles row.");
|
char sql[1024];
|
||||||
|
sqlite3_stmt *statement;
|
||||||
|
snprintf(sql,1024,"SELECT fileid from filemanifests where manifestid='%s';",
|
||||||
|
manifestid);
|
||||||
|
if (sqlite3_prepare_v2(rhizome_db,sql,strlen(sql)+1,&statement,NULL)!=SQLITE_OK)
|
||||||
|
{
|
||||||
|
WHY("sqlite3_prepare_v2() failed");
|
||||||
|
WHY(sql);
|
||||||
|
WHY(sqlite3_errmsg(rhizome_db));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
while ( sqlite3_step(statement)== SQLITE_ROW)
|
||||||
|
{
|
||||||
|
const unsigned char *fileid;
|
||||||
|
if (sqlite3_column_type(statement,0)==SQLITE_TEXT) {
|
||||||
|
fileid=sqlite3_column_text(statement,0);
|
||||||
|
rhizome_update_file_priority((char *)fileid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sqlite3_finalize(statement);
|
||||||
|
}
|
||||||
|
sqlite_exec_int64("DELETE FROM FILEMANIFESTS WHERE manifestid='%s';",manifestid);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Store manifest */
|
/* Store manifest */
|
||||||
snprintf(sqlcmd,1024,"INSERT INTO MANIFESTS(id,manifest,version,inserttime) VALUES('%s',?,%lld,%lld);",
|
snprintf(sqlcmd,1024,
|
||||||
rhizome_bytes_to_hex(m->cryptoSignPublic,crypto_sign_edwards25519sha512batch_PUBLICKEYBYTES),
|
"INSERT INTO MANIFESTS(id,manifest,version,inserttime) VALUES('%s',?,%lld,%lld);",
|
||||||
m->version,
|
manifestid,m->version,overlay_time_in_ms());
|
||||||
overlay_time_in_ms());
|
|
||||||
|
|
||||||
if (m->haveSecret) {
|
if (m->haveSecret) {
|
||||||
if (rhizome_store_keypair_bytes(m->cryptoSignPublic,m->cryptoSignSecret))
|
if (rhizome_store_keypair_bytes(m->cryptoSignPublic,m->cryptoSignSecret))
|
||||||
@ -760,7 +799,7 @@ int rhizome_store_bundle(rhizome_manifest *m,char *associated_filename)
|
|||||||
|
|
||||||
/* Create relationship between file and manifest */
|
/* Create relationship between file and manifest */
|
||||||
long long r=sqlite_exec_int64("INSERT INTO FILEMANIFESTS(manifestid,fileid) VALUES('%s','%s');",
|
long long r=sqlite_exec_int64("INSERT INTO FILEMANIFESTS(manifestid,fileid) VALUES('%s','%s');",
|
||||||
rhizome_bytes_to_hex(m->cryptoSignPublic,crypto_sign_edwards25519sha512batch_PUBLICKEYBYTES),
|
manifestid,
|
||||||
m->fileHexHash);
|
m->fileHexHash);
|
||||||
if (r<0) {
|
if (r<0) {
|
||||||
WHY(sqlite3_errmsg(rhizome_db));
|
WHY(sqlite3_errmsg(rhizome_db));
|
||||||
@ -775,11 +814,10 @@ int rhizome_store_bundle(rhizome_manifest *m,char *associated_filename)
|
|||||||
if (closed<1) closed=0;
|
if (closed<1) closed=0;
|
||||||
int ciphered=rhizome_manifest_get_ll(m,"cipheredgroup");
|
int ciphered=rhizome_manifest_get_ll(m,"cipheredgroup");
|
||||||
if (ciphered<1) ciphered=0;
|
if (ciphered<1) ciphered=0;
|
||||||
sqlite_exec_int64("delete from grouplist where id='%s';",
|
sqlite_exec_int64("delete from grouplist where id='%s';",manifestid);
|
||||||
rhizome_bytes_to_hex(m->cryptoSignPublic,crypto_sign_edwards25519sha512batch_PUBLICKEYBYTES));
|
|
||||||
int storedP
|
int storedP
|
||||||
=sqlite_exec_int64("insert into grouplist(id,closed,ciphered) VALUES('%s',%d,%d);",
|
=sqlite_exec_int64("insert into grouplist(id,closed,ciphered,priority) VALUES('%s',%d,%d,%d);",
|
||||||
rhizome_bytes_to_hex(m->cryptoSignPublic,crypto_sign_edwards25519sha512batch_PUBLICKEYBYTES),closed,ciphered);
|
manifestid,closed,ciphered,RHIZOME_PRIORITY_DEFAULT);
|
||||||
if (storedP<0) return WHY("Failed to insert group manifest into grouplist table.");
|
if (storedP<0) return WHY("Failed to insert group manifest into grouplist table.");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -789,8 +827,7 @@ int rhizome_store_bundle(rhizome_manifest *m,char *associated_filename)
|
|||||||
for(g=0;g<m->group_count;g++)
|
for(g=0;g<m->group_count;g++)
|
||||||
{
|
{
|
||||||
if (sqlite_exec_int64("INSERT INTO GROUPMEMBERSHIPS(manifestid,groupid) VALUES('%s','%s');",
|
if (sqlite_exec_int64("INSERT INTO GROUPMEMBERSHIPS(manifestid,groupid) VALUES('%s','%s');",
|
||||||
rhizome_bytes_to_hex(m->cryptoSignPublic,crypto_sign_edwards25519sha512batch_PUBLICKEYBYTES),
|
manifestid, m->groups[g])<0)
|
||||||
m->groups[g])<0)
|
|
||||||
dud++;
|
dud++;
|
||||||
}
|
}
|
||||||
if (dud>0) return WHY("Failed to create one or more group associations");
|
if (dud>0) return WHY("Failed to create one or more group associations");
|
||||||
|
@ -2,6 +2,14 @@
|
|||||||
#include "sha2.h"
|
#include "sha2.h"
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
|
|
||||||
|
#define RHIZOME_PRIORITY_HIGHEST RHIZOME_PRIORITY_SERVAL_CORE
|
||||||
|
#define RHIZOME_PRIORITY_SERVAL_CORE 5
|
||||||
|
#define RHIZOME_PRIORITY_SUBSCRIBED 4
|
||||||
|
#define RHIZOME_PRIORITY_SERVAL_OPTIONAL 3
|
||||||
|
#define RHIZOME_PRIORITY_DEFAULT 2
|
||||||
|
#define RHIZOME_PRIORITY_SERVAL_BULK 1
|
||||||
|
#define RHIZOME_PRIORITY_NOTINTERESTED 0
|
||||||
|
|
||||||
typedef struct rhizome_signature {
|
typedef struct rhizome_signature {
|
||||||
unsigned char signature[crypto_sign_edwards25519sha512batch_BYTES
|
unsigned char signature[crypto_sign_edwards25519sha512batch_BYTES
|
||||||
+crypto_sign_edwards25519sha512batch_PUBLICKEYBYTES];
|
+crypto_sign_edwards25519sha512batch_PUBLICKEYBYTES];
|
||||||
|
Loading…
Reference in New Issue
Block a user