Implemented handling of File Metadata

This commit is contained in:
Sansar Choinyambuu
2011-11-28 14:28:00 +01:00
committed by Andreas Steffen
parent d22716509a
commit 3e951334a2
11 changed files with 306 additions and 104 deletions
+141 -3
View File
@@ -274,10 +274,10 @@ METHOD(pts_t, is_path_valid, bool, private_pts_t *this, char *path,
pts_error_code_t *error_code)
{
int error;
struct stat sb;
struct stat st;
*error_code = 0;
error = stat(path, &sb);
error = stat(path, &st);
if (error == 0)
{
return TRUE;
@@ -378,6 +378,143 @@ METHOD(pts_t, do_measurements, pts_file_meas_t*,
return measurements;
}
/**
* Obtain statistical information describing a file
*/
static bool file_metadata(char *pathname, pts_file_metadata_t **entry)
{
struct stat st;
pts_file_metadata_t *tmp;
tmp = malloc_thing(pts_file_metadata_t);
if (stat(pathname, &st))
{
DBG1(DBG_PTS, "Unable to obtain statistical information about %s", pathname);
return FALSE;
}
tmp->filename = strdup(pathname);
tmp->meta_length = PTS_FILE_METADATA_SIZE + strlen(tmp->filename);
if (S_ISREG(st.st_mode))
{
tmp->type = PTS_FILE_REGULAR;
}
else if (S_ISDIR(st.st_mode))
{
tmp->type = PTS_FILE_DIRECTORY;
}
else if (S_ISCHR(st.st_mode))
{
tmp->type = PTS_FILE_CHAR_SPEC;
}
else if (S_ISBLK(st.st_mode))
{
tmp->type = PTS_FILE_BLOCK_SPEC;
}
else if (S_ISFIFO(st.st_mode))
{
tmp->type = PTS_FILE_FIFO;
}
else if (S_ISLNK(st.st_mode))
{
tmp->type = PTS_FILE_SYM_LINK;
}
else if (S_ISSOCK(st.st_mode))
{
tmp->type = PTS_FILE_SOCKET;
}
else
{
tmp->type = PTS_FILE_OTHER;
}
tmp->filesize = (u_int64_t)st.st_size;
tmp->create_time = st.st_ctime;
tmp->last_modify_time = st.st_mtime;
tmp->last_access_time = st.st_atime;
tmp->owner_id = (u_int64_t)st.st_uid;
tmp->group_id = (u_int64_t)st.st_gid;
*entry = tmp;
return TRUE;
}
METHOD(pts_t, get_metadata, pts_file_meta_t*,
private_pts_t *this, char *pathname, bool is_directory)
{
pts_file_meta_t *metadata;
pts_file_metadata_t *entry;
/* Create a metadata object */
metadata = pts_file_meta_create();
if (is_directory)
{
enumerator_t *enumerator;
char *rel_name, *abs_name;
struct stat st;
enumerator = enumerator_create_directory(pathname);
if (!enumerator)
{
DBG1(DBG_PTS," directory '%s' can not be opened, %s", pathname,
strerror(errno));
metadata->destroy(metadata);
return NULL;
}
while (enumerator->enumerate(enumerator, &rel_name, &abs_name, &st))
{
/* measure regular files only */
if (S_ISREG(st.st_mode) && *rel_name != '.')
{
if (!file_metadata(abs_name, &entry))
{
enumerator->destroy(enumerator);
metadata->destroy(metadata);
return NULL;
}
DBG3(DBG_PTS, "File name: %s", entry->filename);
DBG3(DBG_PTS, " type: %d", entry->type);
DBG3(DBG_PTS, " size: %d", entry->filesize);
DBG3(DBG_PTS, " create time: %s", ctime(&entry->create_time));
DBG3(DBG_PTS, " last modified: %s", ctime(&entry->last_modify_time));
DBG3(DBG_PTS, " last accessed: %s", ctime(&entry->last_access_time));
DBG3(DBG_PTS, " owner id: %d", entry->owner_id);
DBG3(DBG_PTS, " group id: %d", entry->group_id);
metadata->add(metadata, entry);
}
}
enumerator->destroy(enumerator);
}
else
{
char *filename;
if (!file_metadata(pathname, &entry))
{
metadata->destroy(metadata);
return NULL;
}
filename = get_filename(pathname);
DBG3(DBG_PTS, "File name: %s", entry->filename);
DBG3(DBG_PTS, " type: %d", entry->type);
DBG3(DBG_PTS, " size: %d", entry->filesize);
DBG3(DBG_PTS, " create time: %s", ctime(&entry->create_time));
DBG3(DBG_PTS, " last modified: %s", ctime(&entry->last_modify_time));
DBG3(DBG_PTS, " last accessed: %s", ctime(&entry->last_access_time));
DBG3(DBG_PTS, " owner id: %d", entry->owner_id);
DBG3(DBG_PTS, " group id: %d", entry->group_id);
metadata->add(metadata, entry);
}
return metadata;
}
METHOD(pts_t, destroy, void,
private_pts_t *this)
{
@@ -555,6 +692,7 @@ pts_t *pts_create(bool is_imc)
.set_aik = _set_aik,
.is_path_valid = _is_path_valid,
.do_measurements = _do_measurements,
.get_metadata = _get_metadata,
.destroy = _destroy,
},
.proto_caps = PTS_PROTO_CAPS_V,
+12 -2
View File
@@ -27,14 +27,15 @@ typedef struct pts_t pts_t;
#include "pts_proto_caps.h"
#include "pts_meas_algo.h"
#include "pts_file_meas.h"
#include "pts_file_meta.h"
#include <library.h>
/**
* UTF-8 encoding of the character used to delimiter the filename
*/
#define SOLIDUS_UTF 0x002F
#define REVERSE_SOLIDUS_UTF 0x005C
#define SOLIDUS_UTF 0x2F
#define REVERSE_SOLIDUS_UTF 0x5C
/**
* Class implementing the TCG Platform Trust System (PTS)
@@ -134,6 +135,15 @@ struct pts_t {
*/
pts_file_meas_t* (*do_measurements)(pts_t *this, u_int16_t request_id,
char *pathname, bool is_directory);
/**
* Obtain file metadata
*
* @param pathname Absolute pathname of file/directory
* @param is_directory if TRUE directory contents are requested
* @return PTS File Metadata or NULL if FAILED
*/
pts_file_meta_t* (*get_metadata)(pts_t *this, char *pathname, bool is_directory);
/**
* Destroys a pts_t object.
+3 -42
View File
@@ -56,54 +56,15 @@ METHOD(pts_file_meta_t, get_file_count, int,
}
METHOD(pts_file_meta_t, add, void,
private_pts_file_meta_t *this, char *filename, pts_file_type_t type,
u_int64_t filesize, time_t create_time, time_t last_modify_time, time_t last_access_time,
u_int64_t owner_id, u_int64_t group_id)
private_pts_file_meta_t *this, pts_file_metadata_t *metadata)
{
pts_file_metadata_t *entry;
entry = malloc_thing(pts_file_metadata_t);
entry->filename = strdup(filename);
entry->meta_length = PTS_FILE_METADATA_SIZE + strlen(entry->filename);
entry->type = type;
entry->filesize = filesize;
entry->create_time = create_time;
entry->last_modify_time = last_modify_time;
entry->last_access_time = last_access_time;
entry->owner_id = owner_id;
entry->group_id = group_id;
this->list->insert_last(this->list, entry);
}
/**
* Enumerate file metadata entries
*/
static bool entry_filter(void *null, pts_file_metadata_t **entry,
char **filename, void *i2, u_int16_t *meta_length, void *i3,
pts_file_type_t *type, void *i4, u_int64_t *filesize, void *i5,
time_t *create_time, void *i6, time_t *last_modify_time, void *i7,
time_t *last_access_time, void *i8, u_int64_t *owner_id, void *i9,
u_int64_t *group_id)
{
*filename = (*entry)->filename;
*meta_length = (*entry)->meta_length;
*type = (*entry)->type;
*filesize = (*entry)->filesize;
*create_time = (*entry)->create_time;
*last_modify_time = (*entry)->last_modify_time;
*last_access_time = (*entry)->last_access_time;
*owner_id = (*entry)->owner_id;
*group_id = (*entry)->group_id;
return TRUE;
this->list->insert_last(this->list, metadata);
}
METHOD(pts_file_meta_t, create_enumerator, enumerator_t*,
private_pts_file_meta_t *this)
{
return enumerator_create_filter(this->list->create_enumerator(this->list),
(void*)entry_filter, NULL, NULL);
return this->list->create_enumerator(this->list);
}
METHOD(pts_file_meta_t, destroy, void,
+1 -3
View File
@@ -65,9 +65,7 @@ struct pts_file_meta_t {
* @param filename Name of measured file or directory
* @param metadata File metadata
*/
void (*add)(pts_file_meta_t *this, char *filename, pts_file_type_t type,
u_int64_t filesize, time_t create_time, time_t last_modfy_time, time_t last_access_time,
u_int64_t owner_id, u_int64_t group_id);
void (*add)(pts_file_meta_t *this, pts_file_metadata_t *metadata);
/**
* Create a PTS File Metadata enumerator
+8 -8
View File
@@ -28,21 +28,21 @@ typedef enum pts_file_type_t pts_file_type_t;
* see section 3.17.3 of PTS Protocol: Binding to TNC IF-M Specification
*/
enum pts_file_type_t {
/** Ignore */
/** Either unknown or different from standardized types */
PTS_FILE_OTHER = 0x0000,
/** CRTM */
/** Pipe communication file */
PTS_FILE_FIFO = 0x0001,
/** BIOS */
/** Character special file */
PTS_FILE_CHAR_SPEC = 0x0002,
/** Platform Extensions */
/** Directory */
PTS_FILE_DIRECTORY = 0x0004,
/** Motherboard firmware */
/** Block special file */
PTS_FILE_BLOCK_SPEC = 0x0006,
/** Initial Program Loader */
/** Regular file */
PTS_FILE_REGULAR = 0x0008,
/** Option ROMs */
/** Symbolic link */
PTS_FILE_SYM_LINK = 0x000A,
/** Option ROMs */
/** Socket communication special file */
PTS_FILE_SOCKET = 0x000C,
};