miniroon

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

header.c (1858B)


      1 #include <skalibs/strerr.h>
      2 
      3 #include "netstring.h"
      4 #include "header.h"
      5 
      6 miniroon_error set_header_version(miniroon_header *header, const bytebuffer source) {
      7   if(strbbcmp(source, "capv0") == 0) {
      8     header->version = V0;
      9   } else {
     10     return miniroon_err1(MINIROON_EHDR_INV_VERSION, "Unhandled miniroon version");
     11   }
     12   return MINIROON_OK;
     13 }
     14 
     15 miniroon_error set_header_action(miniroon_header *header, const bytebuffer source) {
     16   if(strbbcmp(source, "revoke") == 0) {
     17     header->action = REVOKE;
     18   } else if(strbbcmp(source, "invoke") == 0) {
     19     header->action = INVOKE;
     20   } else if(strbbcmp(source, "invoke-once") == 0) {
     21     header->action = INVOKE_ONCE;
     22   } else {
     23     return miniroon_err1(MINIROON_EHDR_INV_ACTION, "Unhandled miniroon action");
     24   }
     25   return MINIROON_OK;
     26 }
     27 
     28 miniroon_error parse_header(miniroon_header *header, const bytebuffer source) {
     29   dbg_print_bb1("Got header", source);
     30   netstring_chunk c;
     31   netstring_chunk_init(&c, source);
     32 
     33   if(!netstring_chunk_next(&c)) {
     34     return miniroon_err1(MINIROON_EHDR_NO_VERSION, "Mising version in miniroon header");
     35   }
     36   dbg_print_bb1("Header > Version", c.inner);
     37   if(set_header_version(header, c.inner) != MINIROON_OK) {
     38     return miniroon_current_error;
     39   }
     40 
     41   if(!netstring_chunk_next(&c)) {
     42     return miniroon_err1(MINIROON_EHDR_NO_ID, "Mising ID in miniroon header");
     43   }
     44   dbg_print_bb1("Header > ID", c.inner);
     45   header->id = c.inner;
     46 
     47   if(!netstring_chunk_next(&c)) {
     48     return miniroon_err1(MINIROON_EHDR_NO_ACTION, "Mising action in miniroon header");
     49   }
     50   dbg_print_bb1("Header > Action", c.inner);
     51   if(set_header_action(header, c.inner) != MINIROON_OK) {
     52     return miniroon_current_error;
     53   }
     54 
     55   if(netstring_chunk_next(&c)) {
     56     return miniroon_err1(MINIROON_EHDR_EXTRA, "Extraneous data in miniroon header");
     57   }
     58 
     59   return MINIROON_OK;
     60 }
     61 
     62 /*  vim: sts=2 sw=2 et
     63 */