miniroon

Simplistic macaroon-based authorization for Unix systems
git clone https://ccx.te2000.cz/git/miniroon
Log | Files | Refs | README

caveats.c (2217B)


      1 #include <assert.h>
      2 
      3 #include "verify_common.h"
      4 
      5 #include "caveats.h"
      6 #include "caveats_impl.h"
      7 #include "netstring.h"
      8 #include "miniroon_caveat_name_perfhash.h"
      9 typedef enum miniroon_caveat_name_perfhash_key miniroon_caveat_type;
     10 
     11 void miniroon_caveats_state_init(miniroon_caveats_state *state) {
     12   miniroon_env_map_init(&state->emap);
     13 };
     14 
     15 void miniroon_caveats_state_exec(miniroon_caveats_state *state, char const *const *argv) {
     16   miniroon_env_map_exec(&state->emap, argv);
     17 };
     18 
     19 
     20 miniroon_caveat_type caveat_get_type(netstring_chunk *c, const bytebuffer caveat) {
     21   netstring_chunk_init(c, caveat);
     22   if(!netstring_chunk_next(c)) {
     23     return miniroon_err1(MINIROON_ECAVEAT_MALFORMED, "Mising caveat name");
     24   }
     25   dbg_print_bb1("Caveat ID", c->inner);
     26   return miniroon_caveat_name_perfhash_hash(c->inner.data, c->inner.len);
     27 }
     28 
     29 miniroon_error miniroon_caveat_prepare(const bytebuffer caveat, miniroon_caveats_state *state) {
     30   netstring_chunk c;
     31   switch(caveat_get_type(&c, caveat)) {
     32     case MINIROON_CAVEAT_UNDEFINED:
     33       return miniroon_err1(MINIROON_ECAVEAT_NOT_RECOGNIZED, "Unrecognized caveat type");
     34     case MINIROON_CAVEAT_ENV_IS:
     35       return miniroon_caveat_prepare_env_is(&c, state);
     36     case MINIROON_CAVEAT_ENV_ABSENT:
     37       return miniroon_caveat_prepare_env_absent(&c, state);
     38     case MINIROON_CAVEAT_ENV_FNMATCH:
     39       return miniroon_caveat_prepare_env_fnmatch(&c, state);
     40     default:
     41       return miniroon_err1(MINIROON_ECAVEAT_NOT_RECOGNIZED, "Unimplemented caveat type");
     42   }
     43 }
     44 
     45 miniroon_error miniroon_caveat_validate(const bytebuffer caveat, miniroon_caveats_state *state) {
     46   netstring_chunk c;
     47   switch(caveat_get_type(&c, caveat)) {
     48     case MINIROON_CAVEAT_UNDEFINED:
     49       return miniroon_err1(MINIROON_ECAVEAT_NOT_RECOGNIZED, "Unrecognized caveat type");
     50     case MINIROON_CAVEAT_ENV_IS:
     51       return miniroon_caveat_validate_env_is(&c, state);
     52     case MINIROON_CAVEAT_ENV_ABSENT:
     53       return miniroon_caveat_validate_env_absent(&c, state);
     54     case MINIROON_CAVEAT_ENV_FNMATCH:
     55       return miniroon_caveat_validate_env_fnmatch(&c, state);
     56     default:
     57       return miniroon_err1(MINIROON_ECAVEAT_NOT_RECOGNIZED, "Unimplemented caveat type");
     58   }
     59 }
     60 
     61 /*  vim: sts=2 sw=2 et
     62 */