From 6ef5c05829a366b45a442b40c02a75f19f5e65c3 Mon Sep 17 00:00:00 2001 From: Sansar Choinyambuu Date: Mon, 5 Sep 2011 17:52:31 +0200 Subject: Verification of directory contents measurements implemented --- src/libimcv/tcg/pts/pts_database.c | 65 ++++++++++++++++++++++++++++++++++++-- src/libimcv/tcg/pts/pts_database.h | 64 +++++++++++++++++++++++++++---------- 2 files changed, 110 insertions(+), 19 deletions(-) (limited to 'src/libimcv/tcg') diff --git a/src/libimcv/tcg/pts/pts_database.c b/src/libimcv/tcg/pts/pts_database.c index ea2fa1192..e256dc99e 100644 --- a/src/libimcv/tcg/pts/pts_database.c +++ b/src/libimcv/tcg/pts/pts_database.c @@ -54,7 +54,50 @@ METHOD(pts_database_t, create_file_enumerator, enumerator_t*, return e; } -METHOD(pts_database_t, create_meas_enumerator, enumerator_t*, +METHOD(pts_database_t, is_directory, bool, + private_pts_database_t *this, int id, bool *is_directory) +{ + enumerator_t *e; + int is_dir; + + /* look for a entry in files table with matching id */ + e = this->db->query(this->db, + "SELECT f.type FROM files AS f " + "WHERE f.id = ?", + DB_INT, id, DB_INT); + + if (!e) + { + DBG1(DBG_TNC, "database enumerator failed", id); + return FALSE; + } + if (!e->enumerate(e, &is_dir)) + { + e->destroy(e); + DBG1(DBG_TNC, "file entry with given id:%d not found", id); + return FALSE; + } + + *is_directory = (is_dir == 1) ? TRUE : FALSE; + return TRUE; +} + + +METHOD(pts_database_t, create_files_in_dir_enumerator, enumerator_t*, + private_pts_database_t *this, int id) +{ + enumerator_t *e; + + /* look for all entries in file_hashes belonging to a same directory*/ + e = this->db->query(this->db, + "SELECT DISTINCT f.path FROM files AS f " + "JOIN file_hashes AS fh ON f.id = fh.file " + "WHERE fh.directory = ?", + DB_INT, id, DB_TEXT); + return e; +} + +METHOD(pts_database_t, create_file_meas_enumerator, enumerator_t*, private_pts_database_t *this, char *product, int id, pts_meas_algorithms_t algorithm) { enumerator_t *e; @@ -69,6 +112,21 @@ METHOD(pts_database_t, create_meas_enumerator, enumerator_t*, return e; } +METHOD(pts_database_t, create_dir_meas_enumerator, enumerator_t*, + private_pts_database_t *this, char *product, int id, char *file_name, pts_meas_algorithms_t algorithm) +{ + enumerator_t *e; + + /* look for all entries belonging to a product, file and directory in file_hashes table */ + e = this->db->query(this->db, + "SELECT fh.hash FROM file_hashes AS fh " + "JOIN files AS f ON fh.file = f.id " + "JOIN products AS p ON fh.product = p.id " + "WHERE f.path = ? AND p.name = ? AND fh.directory = ? AND fh.algo = ?", + DB_TEXT, file_name, DB_TEXT, product, DB_INT, id, DB_INT, algorithm, DB_BLOB); + return e; +} + METHOD(pts_database_t, destroy, void, private_pts_database_t *this) { @@ -86,7 +144,10 @@ pts_database_t *pts_database_create(char *uri) INIT(this, .public = { .create_file_enumerator = _create_file_enumerator, - .create_meas_enumerator = _create_meas_enumerator, + .is_directory = _is_directory, + .create_files_in_dir_enumerator = _create_files_in_dir_enumerator, + .create_file_meas_enumerator = _create_file_meas_enumerator, + .create_dir_meas_enumerator = _create_dir_meas_enumerator, .destroy = _destroy, }, .db = lib->db->create(lib->db, uri), diff --git a/src/libimcv/tcg/pts/pts_database.h b/src/libimcv/tcg/pts/pts_database.h index af334d0e5..d4d595c15 100644 --- a/src/libimcv/tcg/pts/pts_database.h +++ b/src/libimcv/tcg/pts/pts_database.h @@ -32,27 +32,57 @@ typedef struct pts_database_t pts_database_t; */ struct pts_database_t { -/** - * Get files to be measured by PTS - * - * @product software product (os, vpn client, etc.) - * @return enumerator over all files matching a given release - */ + /** + * Get files to be measured by PTS + * + * @product software product (os, vpn client, etc.) + * @return enumerator over all files matching a given release + */ enumerator_t* (*create_file_enumerator)(pts_database_t *this, char *product); - + + /** + * Get if file with given id is directory + * + * @id primary key in files table + * @is_directory TRUE if entry with given ID has type of directory + * @return TRUE if query is not failed + */ + bool (*is_directory)(pts_database_t *this, int id, bool *is_directory); + /** - * Get Hash measurement of a file with given id and hashing algorithm type - * - * @product software product (os, vpn client, etc.) - * @id primary key in files table - * @algorithm measurement algorithm type - * @return enumerator over all measurements matching a given release - */ - enumerator_t* (*create_meas_enumerator)(pts_database_t *this, char *product, int id, pts_meas_algorithms_t algorithm); + * Get Enumerator over files in a given directory with measurements + * + * @id primary key in files table, directory column in file_hashes table + * @return enumerator over all measurements matching a given release + */ + enumerator_t* (*create_files_in_dir_enumerator)(pts_database_t *this, int id); + + /** + * Get Hash measurement of a file with given id and hashing algorithm type + * + * @product software product (os, vpn client, etc.) + * @id primary key in files table + * @algorithm measurement algorithm type + * @return enumerator over all measurements matching a given release + */ + enumerator_t* (*create_file_meas_enumerator)(pts_database_t *this, char *product, + int id, pts_meas_algorithms_t algorithm); + /** + * Get Hash measurement of a file in a folder with given id and hashing algorithm type + * + * @product software product (os, vpn client, etc.) + * @id primary key in files table + * @file_name path in files table + * @algorithm measurement algorithm type + * @return enumerator over all measurements matching a given release + */ + enumerator_t* (*create_dir_meas_enumerator)(pts_database_t *this, char *product, + int id, char *file_name, pts_meas_algorithms_t algorithm); + /** - * Destroys a pts_database_t object. - */ + * Destroys a pts_database_t object. + */ void (*destroy)(pts_database_t *this); }; -- cgit v1.2.3