aboutsummaryrefslogtreecommitdiffstats
path: root/src/libimcv/tcg
diff options
context:
space:
mode:
authorSansar Choinyambuu <schoinya@hsr.ch>2011-09-05 17:52:31 +0200
committerAndreas Steffen <andreas.steffen@strongswan.org>2011-09-08 12:08:17 +0200
commit6ef5c05829a366b45a442b40c02a75f19f5e65c3 (patch)
tree5e95defbaa819f793acc54ea5198926bb42bc73b /src/libimcv/tcg
parent35cd6ec43ce9501c8d3aa1e9295ee696533b601d (diff)
downloadstrongswan-6ef5c05829a366b45a442b40c02a75f19f5e65c3.tar.bz2
strongswan-6ef5c05829a366b45a442b40c02a75f19f5e65c3.tar.xz
Verification of directory contents measurements implemented
Diffstat (limited to 'src/libimcv/tcg')
-rw-r--r--src/libimcv/tcg/pts/pts_database.c65
-rw-r--r--src/libimcv/tcg/pts/pts_database.h64
2 files changed, 110 insertions, 19 deletions
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);
};