From 126b950f1bd70d1e5c200bc4157bbbb2798fc838 Mon Sep 17 00:00:00 2001 From: Andre Noll Date: Fri, 13 Mar 2020 19:44:00 +0100 Subject: [PATCH] afs: Switch to sha256 and change default database path. This switches the hash column of the audio file table to use sha256 rather than sha1. Due to the preparations implemented in the previous patches this is a mechanical conversion that could have been performed by a script. The only non-trivial thing is the rename of the audio file table directory, which changes from "audio_files" to "audio-files" because this is the name the conversion script introduced in the previous commit picked. --- afs.c | 2 +- aft.c | 34 +++++++++++++++++----------------- m4/lls/server.suite.m4 | 2 +- web/manual.md | 8 ++++---- 4 files changed, 23 insertions(+), 23 deletions(-) diff --git a/afs.c b/afs.c index b6cce36f..c1393711 100644 --- a/afs.c +++ b/afs.c @@ -659,7 +659,7 @@ static void get_database_dir(void) else { char *home = para_homedir(); database_dir = make_message( - "%s/.paraslash/afs_database-0.4", home); + "%s/.paraslash/afs_database-0.7", home); free(home); } } diff --git a/aft.c b/aft.c index c8c98e7a..35a53904 100644 --- a/aft.c +++ b/aft.c @@ -42,7 +42,7 @@ struct ls_data { */ static struct osl_table *audio_file_table; /* NULL if table not open */ static struct osl_row *current_aft_row; /* NULL if no audio file open */ -static unsigned char current_hash[HASH_SIZE]; /* only used on sighup */ +static unsigned char current_hash[HASH2_SIZE]; /* only used on sighup */ static char *status_items; static char *parser_friendly_status_items; @@ -226,7 +226,7 @@ static struct osl_column_description aft_cols[] = { .storage_flags = OSL_RBTREE | OSL_FIXED_SIZE | OSL_UNIQUE, .name = "hash", .compare_function = aft_hash_compare, - .data_size = HASH_SIZE + .data_size = HASH2_SIZE }, [AFTCOL_PATH] = { .storage_type = OSL_MAPPED_STORAGE, @@ -251,7 +251,7 @@ static struct osl_column_description aft_cols[] = { }; static struct osl_table_description audio_file_table_desc = { - .name = "audio_files", + .name = "audio-files", .num_columns = NUM_AFT_COLUMNS, .flags = OSL_LARGE_TABLE, .column_descriptions = aft_cols @@ -442,7 +442,7 @@ int aft_get_row_of_path(const char *path, struct osl_row **row) */ static int aft_get_row_of_hash(unsigned char *hash, struct osl_row **row) { - const struct osl_object obj = {.data = hash, .size = HASH_SIZE}; + const struct osl_object obj = {.data = hash, .size = HASH2_SIZE}; return osl(osl_get_row(audio_file_table, AFTCOL_HASH, &obj, row)); } @@ -838,7 +838,7 @@ static int print_list_item(struct ls_data *d, struct ls_options *opts, char duration_buf[30]; /* nobody has an audio file long enough to overflow this */ struct afs_info *afsi = &d->afsi; struct afh_info *afhi = &d->afhi; - char asc_hash[2 * HASH_SIZE + 1]; + char asc_hash[2 * HASH2_SIZE + 1]; if (opts->mode == LS_MODE_SHORT) { para_printf(b, "%s\n", d->path); @@ -1041,7 +1041,7 @@ out: */ int open_and_update_audio_file(int *fd) { - unsigned char file_hash[HASH_SIZE]; + unsigned char file_hash[HASH2_SIZE]; struct osl_object afsi_obj; struct afs_info new_afsi; int ret; @@ -1101,7 +1101,7 @@ again: ret = mmap_full_file(d->path, O_RDONLY, &map.data, &map.size, fd); if (ret < 0) goto out; - hash_function(map.data, map.size, file_hash); + hash2_function(map.data, map.size, file_hash); ret = hash_compare(file_hash, d->hash); para_munmap(map.data, map.size); if (ret) { @@ -1141,7 +1141,7 @@ out: static int ls_hash_compare(const void *a, const void *b) { struct ls_data *d1 = *(struct ls_data **)a, *d2 = *(struct ls_data **)b; - return memcmp(d1->hash, d2->hash, HASH_SIZE); + return memcmp(d1->hash, d2->hash, HASH2_SIZE); } static int ls_audio_format_compare(const void *a, const void *b) @@ -1536,7 +1536,7 @@ enum com_add_buffer_offsets { /** The hash of the audio file being added. */ CAB_HASH_OFFSET = 13, /** Start of the path of the audio file. */ - CAB_PATH_OFFSET = (CAB_HASH_OFFSET + HASH_SIZE), + CAB_PATH_OFFSET = (CAB_HASH_OFFSET + HASH2_SIZE), }; /* @@ -1559,7 +1559,7 @@ static void save_add_callback_buffer(unsigned char *hash, const char *path, assert(size <= ~(uint32_t)0); write_u8(buf + CAB_AUDIO_FORMAT_ID_OFFSET, audio_format_num); - memcpy(buf + CAB_HASH_OFFSET, hash, HASH_SIZE); + memcpy(buf + CAB_HASH_OFFSET, hash, HASH2_SIZE); strcpy(buf + CAB_PATH_OFFSET, path); pos = CAB_PATH_OFFSET + path_len; write_u32(buf + CAB_AFHI_OFFSET_POS, pos); @@ -1635,7 +1635,7 @@ static int com_add_callback(struct afs_callback_arg *aca) struct osl_row *hs; struct osl_object objs[NUM_AFT_COLUMNS]; unsigned char *hash; - char asc[2 * HASH_SIZE + 1]; + char asc[2 * HASH2_SIZE + 1]; int ret; char afsi_buf[AFSI_SIZE]; char *slpr = buf + read_u32(buf + CAB_LPR_OFFSET); @@ -1652,7 +1652,7 @@ static int com_add_callback(struct afs_callback_arg *aca) hash = (unsigned char *)buf + CAB_HASH_OFFSET; hash_to_asc(hash, asc); objs[AFTCOL_HASH].data = buf + CAB_HASH_OFFSET; - objs[AFTCOL_HASH].size = HASH_SIZE; + objs[AFTCOL_HASH].size = HASH2_SIZE; path = buf + CAB_PATH_OFFSET; objs[AFTCOL_PATH].data = path; @@ -1715,7 +1715,7 @@ static int com_add_callback(struct afs_callback_arg *aca) objs[AFTCOL_CHUNKS].data = buf + chunks_offset; objs[AFTCOL_CHUNKS].size = aca->query.size - chunks_offset; if (pb && !hs) { /* update pb's hash */ - char old_asc[2 * HASH_SIZE + 1]; + char old_asc[2 * HASH2_SIZE + 1]; unsigned char *old_hash; ret = get_hash_of_row(pb, &old_hash); if (ret < 0) @@ -1820,7 +1820,7 @@ static int add_one_audio_file(const char *path, void *private_data) struct afh_info afhi, *afhi_ptr = NULL; struct osl_row *pb = NULL, *hs = NULL; /* path brother/hash sister */ struct osl_object map, obj = {.data = NULL}, query; - unsigned char hash[HASH_SIZE]; + unsigned char hash[HASH2_SIZE]; bool a_given = SERVER_CMD_OPT_GIVEN(ADD, ALL, pad->lpr); bool f_given = SERVER_CMD_OPT_GIVEN(ADD, FORCE, pad->lpr); bool l_given = SERVER_CMD_OPT_GIVEN(ADD, LAZY, pad->lpr); @@ -1848,11 +1848,11 @@ static int add_one_audio_file(const char *path, void *private_data) ret = mmap_full_file(path, O_RDONLY, &map.data, &map.size, &fd); if (ret < 0) goto out_free; - hash_function(map.data, map.size, hash); + hash2_function(map.data, map.size, hash); /* Check whether the database contains a file with the same hash. */ query.data = hash; - query.size = HASH_SIZE; + query.size = HASH2_SIZE; ret = send_callback_request(hash_sister_callback, &query, get_row_pointer_from_result, &hs); if (ret < 0) @@ -2517,7 +2517,7 @@ static void aft_close(void) PARA_WARNING_LOG("hash lookup failure\n"); current_aft_row = NULL; } else - memcpy(current_hash, p, HASH_SIZE); + memcpy(current_hash, p, HASH2_SIZE); } osl_close_table(audio_file_table, OSL_MARK_CLEAN); audio_file_table = NULL; diff --git a/m4/lls/server.suite.m4 b/m4/lls/server.suite.m4 index 93e4b573..1c941c43 100644 --- a/m4/lls/server.suite.m4 +++ b/m4/lls/server.suite.m4 @@ -133,7 +133,7 @@ version-string = GIT_VERSION() typestr = directory [help] The directory which contains the database for the audio file - selector. The default is ~/.paraslash/afs_database-0.4. + selector. The default is ~/.paraslash/afs_database-0.7. If no database was found, the "init" command must be executed to initialize the database. Once initialized, audio files may added with diff --git a/web/manual.md b/web/manual.md index db28a699..5803c0bb 100644 --- a/web/manual.md +++ b/web/manual.md @@ -488,10 +488,10 @@ An empty database is created with para_client init This initializes a couple of empty tables under -~/.paraslash/afs_database-0.4. You normally don't need to look at these +~/.paraslash/afs_database-0.7. You normally don't need to look at these tables, but it's good to know that you can start from scratch with - rm -rf ~/.paraslash/afs_database-0.4 + rm -rf ~/.paraslash/afs_database-0.7 in case something went wrong. @@ -1175,14 +1175,14 @@ may refuse to start again because of "dirty osl tables". In this case you'll have to run the oslfsck program of libosl to fix your database: - oslfsck -fd ~/.paraslash/afs_database-0.4 + oslfsck -fd ~/.paraslash/afs_database-0.7 However, make sure para_server isn't running before executing oslfsck. If you don't mind to recreate your database you can start from scratch by removing the entire database directory, i.e. - rm -rf ~/.paraslash/afs_database-0.4 + rm -rf ~/.paraslash/afs_database-0.7 Be aware that this removes all attribute definitions, all playlists and all mood definitions and requires to re-initialize the tables. -- 2.39.5