aboutsummaryrefslogtreecommitdiffstats
path: root/src/libimcv
diff options
context:
space:
mode:
authorAndreas Steffen <andreas.steffen@strongswan.org>2011-10-31 18:34:16 +0100
committerAndreas Steffen <andreas.steffen@strongswan.org>2011-11-28 14:39:53 +0100
commitf4159ff81686f33378d5dd7b7b5d0a1e61fadc93 (patch)
treec61d1922bd730fa260c6ecbcffce7ac96ae9acbf /src/libimcv
parent3cd6077b75c3e95c5efac3de5cd9796403d09445 (diff)
downloadstrongswan-f4159ff81686f33378d5dd7b7b5d0a1e61fadc93.tar.bz2
strongswan-f4159ff81686f33378d5dd7b7b5d0a1e61fadc93.tar.xz
add product and file entries to database
Diffstat (limited to 'src/libimcv')
-rw-r--r--src/libimcv/plugins/imv_attestation/attest.c35
-rw-r--r--src/libimcv/plugins/imv_attestation/attest_db.c89
-rw-r--r--src/libimcv/plugins/imv_attestation/attest_db.h19
3 files changed, 115 insertions, 28 deletions
diff --git a/src/libimcv/plugins/imv_attestation/attest.c b/src/libimcv/plugins/imv_attestation/attest.c
index 6b45dafe5..51e6ef7cd 100644
--- a/src/libimcv/plugins/imv_attestation/attest.c
+++ b/src/libimcv/plugins/imv_attestation/attest.c
@@ -48,7 +48,9 @@ static void do_args(int argc, char *argv[])
OP_FILES,
OP_PRODUCTS,
OP_HASHES,
- } operation = OP_UNDEF;
+ OP_ADD,
+ OP_DEL,
+ } op = OP_UNDEF;
/* reinit getopt state */
optind = 0;
@@ -60,9 +62,12 @@ static void do_args(int argc, char *argv[])
struct option long_opts[] = {
{ "help", no_argument, NULL, 'h' },
{ "files", no_argument, NULL, 'f' },
+ { "add", no_argument, NULL, 'a' },
+ { "del", no_argument, NULL, 'd' },
{ "products", no_argument, NULL, 'p' },
{ "hashes", no_argument, NULL, 'H' },
{ "directory", required_argument, NULL, 'D' },
+ { "dir", required_argument, NULL, 'D' },
{ "file", required_argument, NULL, 'F' },
{ "product", required_argument, NULL, 'P' },
{ "sha1", no_argument, NULL, '1' },
@@ -80,31 +85,37 @@ static void do_args(int argc, char *argv[])
case EOF:
break;
case 'h':
- operation = OP_USAGE;
+ op = OP_USAGE;
break;
case 'f':
- operation = OP_FILES;
+ op = OP_FILES;
continue;
case 'p':
- operation = OP_PRODUCTS;
+ op = OP_PRODUCTS;
continue;
case 'H':
- operation = OP_HASHES;
+ op = OP_HASHES;
+ continue;
+ case 'a':
+ op = OP_ADD;
+ continue;
+ case 'd':
+ op = OP_DEL;
continue;
case 'D':
- if (!attest->set_directory(attest, optarg))
+ if (!attest->set_directory(attest, optarg, op == OP_ADD))
{
exit(EXIT_FAILURE);
}
continue;
case 'F':
- if (!attest->set_file(attest, optarg))
+ if (!attest->set_file(attest, optarg, op == OP_ADD))
{
exit(EXIT_FAILURE);
}
continue;
case 'P':
- if (!attest->set_product(attest, optarg))
+ if (!attest->set_product(attest, optarg, op == OP_ADD))
{
exit(EXIT_FAILURE);
}
@@ -140,7 +151,7 @@ static void do_args(int argc, char *argv[])
break;
}
- switch (operation)
+ switch (op)
{
case OP_USAGE:
usage();
@@ -154,6 +165,12 @@ static void do_args(int argc, char *argv[])
case OP_HASHES:
attest->list_hashes(attest);
break;
+ case OP_ADD:
+ attest->add(attest);
+ break;
+ case OP_DEL:
+ attest->delete(attest);
+ break;
default:
usage();
exit(EXIT_FAILURE);
diff --git a/src/libimcv/plugins/imv_attestation/attest_db.c b/src/libimcv/plugins/imv_attestation/attest_db.c
index 652950241..369ab2ea1 100644
--- a/src/libimcv/plugins/imv_attestation/attest_db.c
+++ b/src/libimcv/plugins/imv_attestation/attest_db.c
@@ -85,7 +85,7 @@ struct private_attest_db_t {
};
METHOD(attest_db_t, set_product, bool,
- private_attest_db_t *this, char *product)
+ private_attest_db_t *this, char *product, bool create)
{
enumerator_t *e;
@@ -104,12 +104,26 @@ METHOD(attest_db_t, set_product, bool,
{
this->product_set = TRUE;
}
- else
- {
- printf("product '%s' not found in database\n", product);
- }
e->destroy(e);
}
+ if (this->product_set)
+ {
+ return TRUE;
+ }
+
+ if (!create)
+ {
+ printf("product '%s' not found in database\n", product);
+ }
+
+ /* Add a new database entry */
+ this->product_set = this->db->execute(this->db, &this->pid,
+ "INSERT INTO products (name) VALUES (?)",
+ DB_TEXT, product);
+
+ printf("product '%s' %sinserted into database\n", product,
+ this->product_set ? "" : "could not be ");
+
return this->product_set;
}
@@ -145,7 +159,7 @@ METHOD(attest_db_t, set_pid, bool,
}
METHOD(attest_db_t, set_file, bool,
- private_attest_db_t *this, char *file)
+ private_attest_db_t *this, char *file, bool create)
{
enumerator_t *e;
@@ -164,12 +178,26 @@ METHOD(attest_db_t, set_file, bool,
{
this->file_set = TRUE;
}
- else
- {
- printf("file '%s' not found in database\n", file);
- }
e->destroy(e);
}
+ if (this->file_set)
+ {
+ return TRUE;
+ }
+
+ if (!create)
+ {
+ printf("file '%s' not found in database\n", file);
+ }
+
+ /* Add a new database entry */
+ this->file_set = this->db->execute(this->db, &this->fid,
+ "INSERT INTO files (type, path) VALUES (0, ?)",
+ DB_TEXT, file);
+
+ printf("file '%s' %sinserted into database\n", file,
+ this->file_set ? "" : "could not be ");
+
return this->file_set;
}
@@ -205,7 +233,7 @@ METHOD(attest_db_t, set_fid, bool,
}
METHOD(attest_db_t, set_directory, bool,
- private_attest_db_t *this, char *dir)
+ private_attest_db_t *this, char *dir, bool create)
{
enumerator_t *e;
@@ -217,7 +245,8 @@ METHOD(attest_db_t, set_directory, bool,
free(this->dir);
this->dir = strdup(dir);
- e = this->db->query(this->db, "SELECT id FROM files WHERE path = ?",
+ e = this->db->query(this->db,
+ "SELECT id FROM files WHERE type = 1 AND path = ?",
DB_TEXT, dir, DB_INT);
if (e)
{
@@ -225,12 +254,26 @@ METHOD(attest_db_t, set_directory, bool,
{
this->dir_set = TRUE;
}
- else
- {
- printf("directory '%s' not found in database\n", dir);
- }
e->destroy(e);
}
+ if (this->dir_set)
+ {
+ return TRUE;
+ }
+
+ if (!create)
+ {
+ printf("directory '%s' not found in database\n", dir);
+ }
+
+ /* Add a new database entry */
+ this->dir_set = this->db->execute(this->db, &this->did,
+ "INSERT INTO files (type, path) VALUES (1, ?)",
+ DB_TEXT, dir);
+
+ printf("directory '%s' %sinserted into database\n", dir,
+ this->dir_set ? "" : "could not be ");
+
return this->dir_set;
}
@@ -519,6 +562,18 @@ METHOD(attest_db_t, list_hashes, void,
free(dir);
}
+METHOD(attest_db_t, add, bool,
+ private_attest_db_t *this)
+{
+ return FALSE;
+}
+
+METHOD(attest_db_t, delete, bool,
+ private_attest_db_t *this)
+{
+ return FALSE;
+}
+
METHOD(attest_db_t, destroy, void,
private_attest_db_t *this)
{
@@ -548,6 +603,8 @@ attest_db_t *attest_db_create(char *uri)
.list_products = _list_products,
.list_files = _list_files,
.list_hashes = _list_hashes,
+ .add = _add,
+ .delete = _delete,
.destroy = _destroy,
},
.dir = strdup(""),
diff --git a/src/libimcv/plugins/imv_attestation/attest_db.h b/src/libimcv/plugins/imv_attestation/attest_db.h
index 9c6ba1ab2..990297eb2 100644
--- a/src/libimcv/plugins/imv_attestation/attest_db.h
+++ b/src/libimcv/plugins/imv_attestation/attest_db.h
@@ -37,9 +37,10 @@ struct attest_db_t {
* Set software product to be queried
*
* @param product software product
+ * @param create if TRUE create database entry if it doesn't exist
* @return TRUE if successful
*/
- bool (*set_product)(attest_db_t *this, char *product);
+ bool (*set_product)(attest_db_t *this, char *product, bool create);
/**
* Set primary key of the software product to be queried
@@ -53,9 +54,10 @@ struct attest_db_t {
* Set measurement file to be queried
*
* @param file measurement file
+ * @param create if TRUE create database entry if it doesn't exist
* @return TRUE if successful
*/
- bool (*set_file)(attest_db_t *this, char *file);
+ bool (*set_file)(attest_db_t *this, char *file, bool create);
/**
* Set primary key of the measurement file to be queried
@@ -69,9 +71,10 @@ struct attest_db_t {
* Set directory of the measurement file to be queried
*
* @param directory directory containing the measurement file
+ * @param create if TRUE create database entry if it doesn't exist
* @return TRUE if successful
*/
- bool (*set_directory)(attest_db_t *this, char *dir);
+ bool (*set_directory)(attest_db_t *this, char *dir, bool create);
/**
* Set primary key of the directory to be queried
@@ -104,6 +107,16 @@ struct attest_db_t {
void (*list_hashes)(attest_db_t *this);
/**
+ * Add an entry to the database
+ */
+ bool (*add)(attest_db_t *this);
+
+ /**
+ * Delete an entry from the database
+ */
+ bool (*delete)(attest_db_t *this);
+
+ /**
* Destroy attest_db_t object
*/
void (*destroy)(attest_db_t *this);