/** ** prover_yap.c ** implement a C prover using the libabac C interface **/ #include #include #include #include "abac.h" #include "options.h" int main(int argc, char **argv) { int i, success=0; abac_credential_t *cred=NULL; abac_credential_t **credentials=NULL; abac_id_credential_t *prin=NULL; abac_id_credential_t **principals=NULL; options_t opts = { 0, }; get_options(argc, argv, &opts); abac_context_t *ctx = abac_context_new(); abac_context_load_directory(ctx, opts.keystore); abac_context_set_no_partial_proof(ctx); if(opts.filename) { FILE *fp=fopen(opts.filename,"w+"); credentials = abac_context_credentials(ctx); if (credentials != NULL) { for (i = 0; credentials[i] != NULL; ++i) { cred = credentials[i]; abac_print_cred_info(cred,fp); } abac_free_credentials(credentials); } principals = abac_context_principals(ctx); if (principals != NULL) { for (i = 0; principals[i] != NULL; ++i) { prin = principals[i]; abac_print_prin_info(prin,fp); } abac_free_principals(principals); } fclose(fp); return 0; } if(opts.dbdump) { show_yap_db("yap db"); return 0; } char *query=NULL; char *with=NULL; if(opts.role && opts.principal) { query=opts.role; with=opts.principal; } else { if(opts.oset) { query=opts.oset; } if(opts.principal) { with=opts.principal; } else if(opts.object) { with=opts.object; } if(with==NULL || query==NULL) { puts("prover eeekkk \n"); assert(0); } } credentials = abac_context_query(ctx, query, with, &success); if (success) puts("prover success!!"); else puts("prover failed!!"); /* if returning partial, success=0, and credential is not NULL */ if (credentials != NULL && credentials[0] != NULL) { puts("credentials needed :"); for (i = 0; credentials[i] != NULL; ++i) { cred = credentials[i]; abac_print_cred_info(cred,NULL); } } if(credentials) abac_free_credentials(credentials); /** limit at most 2 more fact solution proof **/ if(success && opts.all) { int n=2; while(n && success) { credentials = abac_context_query_again(ctx, &success); if (success) puts("another proof!!"); else puts("no more!!"); if (credentials != NULL && success) { puts("credentials needed :"); for (i = 0; credentials[i] != NULL; ++i) { cred = credentials[i]; abac_print_cred_info(cred,NULL); } } if(credentials) abac_free_credentials(credentials); n=n-1; } } abac_context_free(ctx); return 0; }