mirror of
https://github.com/servalproject/serval-dna.git
synced 2024-12-20 21:53:12 +00:00
Insist on 'service' field in all manifests
The "rhizome file add" command assumes service=file if no manifest supplied or the manifest lacks a service field. The "rhizome extract manifest" command includes the service in its CLI output.
This commit is contained in:
parent
1171e60704
commit
9a51c76dfb
@ -1089,16 +1089,23 @@ int app_rhizome_add_file(int argc, const char *const *argv, struct command_line_
|
|||||||
return WHY("Manifest struct could not be allocated -- not added to rhizome");
|
return WHY("Manifest struct could not be allocated -- not added to rhizome");
|
||||||
}
|
}
|
||||||
/* Fill in a few missing manifest fields, to make it easier to use when adding new files:
|
/* Fill in a few missing manifest fields, to make it easier to use when adding new files:
|
||||||
|
- the default service is "file"
|
||||||
- the current time for "date"
|
- the current time for "date"
|
||||||
- if service is "file", then the payload file's basename for "name"
|
- if service is "file", then the payload file's basename for "name"
|
||||||
*/
|
*/
|
||||||
|
const char *service = rhizome_manifest_get(m, "service", NULL, 0);
|
||||||
|
if (service == NULL) {
|
||||||
|
rhizome_manifest_set(m, "service", (service = "file"));
|
||||||
|
}
|
||||||
if (rhizome_manifest_get(m, "date", NULL, 0) == NULL) {
|
if (rhizome_manifest_get(m, "date", NULL, 0) == NULL) {
|
||||||
rhizome_manifest_set_ll(m, "date", gettime_ms());
|
rhizome_manifest_set_ll(m, "date", gettime_ms());
|
||||||
}
|
}
|
||||||
if (rhizome_manifest_get(m, "name", NULL, 0) == NULL) {
|
if (strcasecmp("file", service) == 0) {
|
||||||
const char *name = strrchr(filepath, '/');
|
if (rhizome_manifest_get(m, "name", NULL, 0) == NULL) {
|
||||||
name = name ? name + 1 : filepath;
|
const char *name = strrchr(filepath, '/');
|
||||||
rhizome_manifest_set(m, "name", name);
|
name = name ? name + 1 : filepath;
|
||||||
|
rhizome_manifest_set(m, "name", name);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
/* Add the manifest and its associated file to the Rhizome database, generating an "id" in the
|
/* Add the manifest and its associated file to the Rhizome database, generating an "id" in the
|
||||||
* process */
|
* process */
|
||||||
@ -1121,6 +1128,11 @@ int app_rhizome_add_file(int argc, const char *const *argv, struct command_line_
|
|||||||
invoking this command can read it to obtain feedback on the result. */
|
invoking this command can read it to obtain feedback on the result. */
|
||||||
if (manifestpath[0] && rhizome_write_manifest_file(mout, manifestpath) == -1)
|
if (manifestpath[0] && rhizome_write_manifest_file(mout, manifestpath) == -1)
|
||||||
ret = WHY("Could not overwrite manifest file.");
|
ret = WHY("Could not overwrite manifest file.");
|
||||||
|
service = rhizome_manifest_get(mout, "service", NULL, 0);
|
||||||
|
if (service) {
|
||||||
|
cli_puts("service"); cli_delim(":");
|
||||||
|
cli_puts(service); cli_delim("\n");
|
||||||
|
}
|
||||||
cli_puts("manifestid"); cli_delim(":");
|
cli_puts("manifestid"); cli_delim(":");
|
||||||
cli_puts(rhizome_bytes_to_hex(mout->cryptoSignPublic, crypto_sign_edwards25519sha512batch_PUBLICKEYBYTES)); cli_delim("\n");
|
cli_puts(rhizome_bytes_to_hex(mout->cryptoSignPublic, crypto_sign_edwards25519sha512batch_PUBLICKEYBYTES)); cli_delim("\n");
|
||||||
cli_puts("filehash"); cli_delim(":");
|
cli_puts("filehash"); cli_delim(":");
|
||||||
|
@ -147,6 +147,9 @@ int rhizome_add_manifest(rhizome_manifest *m_in,
|
|||||||
if (m_out) *m_out = NULL;
|
if (m_out) *m_out = NULL;
|
||||||
|
|
||||||
/* Ensure manifest meets basic sanity checks. */
|
/* Ensure manifest meets basic sanity checks. */
|
||||||
|
const char *service = rhizome_manifest_get(m_in, "service", NULL, 0);
|
||||||
|
if (service == NULL || !service[0])
|
||||||
|
return WHY("Manifest missing 'service' field");
|
||||||
const char *name = rhizome_manifest_get(m_in, "name", NULL, 0);
|
const char *name = rhizome_manifest_get(m_in, "name", NULL, 0);
|
||||||
if (name == NULL || !name[0])
|
if (name == NULL || !name[0])
|
||||||
return WHY("Manifest missing 'name' field");
|
return WHY("Manifest missing 'name' field");
|
||||||
|
@ -952,24 +952,29 @@ int rhizome_retrieve_manifest(const char *manifestid, rhizome_manifest **mp)
|
|||||||
} else {
|
} else {
|
||||||
ret = 1;
|
ret = 1;
|
||||||
rhizome_hex_to_bytes(manifestid, m->cryptoSignPublic, crypto_sign_edwards25519sha512batch_PUBLICKEYBYTES*2);
|
rhizome_hex_to_bytes(manifestid, m->cryptoSignPublic, crypto_sign_edwards25519sha512batch_PUBLICKEYBYTES*2);
|
||||||
|
const char *blob_service = rhizome_manifest_get(m, "service", NULL, 0);
|
||||||
|
if (blob_service == NULL)
|
||||||
|
ret = WHY("Manifest is missing 'service' field");
|
||||||
const char *blob_filehash = rhizome_manifest_get(m, "filehash", NULL, 0);
|
const char *blob_filehash = rhizome_manifest_get(m, "filehash", NULL, 0);
|
||||||
if (blob_filehash == NULL)
|
if (blob_filehash == NULL)
|
||||||
ret = WHY("Manifest is missing filehash line");
|
ret = WHY("Manifest is missing 'filehash' field");
|
||||||
else {
|
else {
|
||||||
memcpy(m->fileHexHash, blob_filehash, SHA512_DIGEST_STRING_LENGTH);
|
memcpy(m->fileHexHash, blob_filehash, SHA512_DIGEST_STRING_LENGTH);
|
||||||
m->fileHashedP = 1;
|
m->fileHashedP = 1;
|
||||||
}
|
}
|
||||||
long long blob_version = rhizome_manifest_get_ll(m, "version");
|
long long blob_version = rhizome_manifest_get_ll(m, "version");
|
||||||
if (blob_version == -1)
|
if (blob_version == -1)
|
||||||
ret = WHY("Manifest is missing version line");
|
ret = WHY("Manifest is missing 'version' field");
|
||||||
else
|
else
|
||||||
m->version = blob_version;
|
m->version = blob_version;
|
||||||
long long lengthq = rhizome_manifest_get_ll(m, "filesize");
|
long long filesizeq = rhizome_manifest_get_ll(m, "filesize");
|
||||||
if (lengthq == -1)
|
if (filesizeq == -1)
|
||||||
ret = WHY("Manifest is missing filesize line");
|
ret = WHY("Manifest is missing 'filesize' field");
|
||||||
else
|
else
|
||||||
m->fileLength = lengthq;
|
m->fileLength = filesizeq;
|
||||||
if (ret == 1) {
|
if (ret == 1) {
|
||||||
|
cli_puts("service"); cli_delim(":");
|
||||||
|
cli_puts(blob_service); cli_delim("\n");
|
||||||
cli_puts("manifestid"); cli_delim(":");
|
cli_puts("manifestid"); cli_delim(":");
|
||||||
cli_puts((const char *)sqlite3_column_text(statement, 0)); cli_delim("\n");
|
cli_puts((const char *)sqlite3_column_text(statement, 0)); cli_delim("\n");
|
||||||
cli_puts("version"); cli_delim(":");
|
cli_puts("version"); cli_delim(":");
|
||||||
|
@ -45,7 +45,8 @@ assert_rhizome_list() {
|
|||||||
assert_stdout_add_file() {
|
assert_stdout_add_file() {
|
||||||
local filename="$1"
|
local filename="$1"
|
||||||
unpack_manifest_for_grep "$filename"
|
unpack_manifest_for_grep "$filename"
|
||||||
assertStdoutLineCount '==' 4
|
assertStdoutLineCount '==' 5
|
||||||
|
assertStdoutGrep --matches=1 '^service:file$'
|
||||||
assertStdoutGrep --matches=1 "^name:${2:-$re_name}\$"
|
assertStdoutGrep --matches=1 "^name:${2:-$re_name}\$"
|
||||||
assertStdoutGrep --matches=1 "^manifestid:$re_manifestid\$"
|
assertStdoutGrep --matches=1 "^manifestid:$re_manifestid\$"
|
||||||
assertStdoutGrep --matches=1 "^filehash:$re_filehash\$"
|
assertStdoutGrep --matches=1 "^filehash:$re_filehash\$"
|
||||||
@ -100,6 +101,10 @@ extract_manifest() {
|
|||||||
[ -n "$_var" ] && eval $_var=$_value
|
[ -n "$_var" ] && eval $_var=$_value
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extract_manifest_service() {
|
||||||
|
extract_manifest "$1" "$2" service '[0-9a-zA-Z]\+'
|
||||||
|
}
|
||||||
|
|
||||||
extract_manifest_id() {
|
extract_manifest_id() {
|
||||||
extract_manifest "$1" "$2" id '[0-9a-fA-F]\{64\}'
|
extract_manifest "$1" "$2" id '[0-9a-fA-F]\{64\}'
|
||||||
}
|
}
|
||||||
@ -157,6 +162,7 @@ test_AddNonExistManifest() {
|
|||||||
assert_stdout_add_file file1
|
assert_stdout_add_file file1
|
||||||
assert [ -r file1.manifest ]
|
assert [ -r file1.manifest ]
|
||||||
tfw_cat -v file1.manifest
|
tfw_cat -v file1.manifest
|
||||||
|
assertGrep file1.manifest '^service=file$'
|
||||||
assertGrep file1.manifest '^name=file1$'
|
assertGrep file1.manifest '^name=file1$'
|
||||||
assertGrep file1.manifest '^date=[0-9]\+$'
|
assertGrep file1.manifest '^date=[0-9]\+$'
|
||||||
assertGrep file1.manifest '^version=[0-9]\+$'
|
assertGrep file1.manifest '^version=[0-9]\+$'
|
||||||
@ -177,6 +183,7 @@ test_AddManifest() {
|
|||||||
executeOk $dna rhizome add file $sid '' file1 file1.manifest
|
executeOk $dna rhizome add file $sid '' file1 file1.manifest
|
||||||
tfw_cat --stdout --stderr -v file1.manifest
|
tfw_cat --stdout --stderr -v file1.manifest
|
||||||
assert_stdout_add_file file1 wah
|
assert_stdout_add_file file1 wah
|
||||||
|
assertGrep file1.manifest '^service=file$'
|
||||||
assertGrep file1.manifest '^name=wah$'
|
assertGrep file1.manifest '^name=wah$'
|
||||||
assertGrep file1.manifest '^version=[0-9]\+$'
|
assertGrep file1.manifest '^version=[0-9]\+$'
|
||||||
assertGrep file1.manifest '^date=12345$'
|
assertGrep file1.manifest '^date=12345$'
|
||||||
@ -214,8 +221,9 @@ setup_AddThenExtractManifest() {
|
|||||||
test_AddThenExtractManifest() {
|
test_AddThenExtractManifest() {
|
||||||
executeOk $dna rhizome extract manifest $manifestid file1x.manifest
|
executeOk $dna rhizome extract manifest $manifestid file1x.manifest
|
||||||
assert cmp file1.manifest file1x.manifest
|
assert cmp file1.manifest file1x.manifest
|
||||||
assertStdoutLineCount '==' 5
|
assertStdoutLineCount '==' 6
|
||||||
local size=$(( $(cat file1 | wc -c) + 0 ))
|
local size=$(( $(cat file1 | wc -c) + 0 ))
|
||||||
|
assertStdoutGrep --matches=1 "^service:file$"
|
||||||
assertStdoutGrep --matches=1 "^manifestid:$manifestid$"
|
assertStdoutGrep --matches=1 "^manifestid:$manifestid$"
|
||||||
assertStdoutGrep --matches=1 "^version:$version$"
|
assertStdoutGrep --matches=1 "^version:$version$"
|
||||||
assertStdoutGrep --matches=1 "^inserttime:[0-9]\+$"
|
assertStdoutGrep --matches=1 "^inserttime:[0-9]\+$"
|
||||||
|
Loading…
Reference in New Issue
Block a user