caveat_env_fnmatch.c (2171B)
1 #include <assert.h> 2 #include <string.h> 3 #include <fnmatch.h> 4 5 #include "verify_common.h" 6 #define caveat_name "env-glob" 7 #include "caveats_impl.h" 8 9 10 miniroon_error miniroon_caveat_prepare_env_fnmatch(netstring_chunk *c, miniroon_caveats_state *state) { 11 bytebuffer name, pattern; 12 13 if(!netstring_chunk_next(c)) { 14 return caveat_inv1("missing variable name"); 15 } 16 name = c->inner; 17 18 if(!netstring_chunk_next(c)) { 19 return caveat_inv1("missing variable pattern"); 20 } 21 pattern = c->inner; 22 23 if(netstring_chunk_next(c)) { 24 return caveat_inv1("unexpected argument"); 25 } 26 27 char name_0[name.len + 1]; 28 memcpy(name_0, name.data, name.len); 29 name_0[name.len] = 0; 30 31 miniroon_env_entry *entry = miniroon_env_map_find(&state->emap, name); 32 if(entry == NULL) { 33 return caveat_fail3("variable '", name_0, "' not in allowlist"); 34 } 35 return MINIROON_OK; 36 } 37 38 miniroon_error miniroon_caveat_validate_env_fnmatch(netstring_chunk *c, miniroon_caveats_state *state) { 39 bytebuffer name, pattern; 40 41 if(!netstring_chunk_next(c)) { 42 return caveat_inv1("missing variable name"); 43 } 44 name = c->inner; 45 46 if(!netstring_chunk_next(c)) { 47 return caveat_inv1("missing variable pattern"); 48 } 49 pattern = c->inner; 50 51 if(netstring_chunk_next(c)) { 52 return caveat_inv1("unexpected argument"); 53 } 54 55 char name_0[name.len + 1]; 56 memcpy(name_0, name.data, name.len); 57 name_0[name.len] = 0; 58 59 miniroon_env_entry *entry = miniroon_env_map_find(&state->emap, name); 60 if(entry == NULL) { 61 return caveat_fail3("variable '", name_0, "' not in allowlist"); 62 } 63 64 if(entry->state != ENV_SET) { 65 return caveat_fail3("required variable '", name_0, "' not provided: "); 66 } 67 assert(entry->value.len); 68 assert(entry->value.data); 69 70 char pattern_0[pattern.len + 1]; 71 memcpy(pattern_0, pattern.data, pattern.len); 72 pattern_0[pattern.len] = 0; 73 74 switch(fnmatch(pattern_0, entry->value.data, 0)) { 75 case 0: 76 return MINIROON_OK; 77 case FNM_NOMATCH: 78 return caveat_fail3("variable '", name_0, "' does not match required pattern"); 79 default: 80 return caveat_fail2("failure matching required pattern: ", name_0); 81 } 82 83 } 84 85 /* vim: sts=2 sw=2 et 86 */