/*! \brief * MI function to make allow_uri query. */ struct mi_root* mi_allow_uri(struct mi_root *cmd, void *param) { struct mi_node *node; str *basenamep, *urip, *contactp; char basename[MAX_FILE_LEN + 1]; char uri[MAX_URI_SIZE + 1], contact[MAX_URI_SIZE + 1]; unsigned int allow_suffix_len; node = cmd->node.kids; if (node == NULL || node->next == NULL || node->next->next == NULL || node->next->next->next != NULL) return init_mi_tree(400, MI_SSTR(MI_MISSING_PARM)); /* look for base name */ basenamep = &node->value; if (basenamep == NULL) return init_mi_tree(404, MI_SSTR("Basename is NULL")); allow_suffix_len = strlen(allow_suffix); if (basenamep->len + allow_suffix_len + 1 > MAX_FILE_LEN) return init_mi_tree(404, MI_SSTR("Basename is too long")); memcpy(basename, basenamep->s, basenamep->len); memcpy(basename + basenamep->len, allow_suffix, allow_suffix_len); basename[basenamep->len + allow_suffix_len] = 0; /* look for uri */ urip = &node->next->value; if (urip == NULL) return init_mi_tree(404, MI_SSTR("URI is NULL")); if (urip->len > MAX_URI_SIZE) return init_mi_tree(404, MI_SSTR("URI is too long")); memcpy(uri, urip->s, urip->len); uri[urip->len] = 0; /* look for contact */ contactp = &node->next->next->value; if (contactp == NULL) return init_mi_tree(404, MI_SSTR("Contact is NULL")); if (contactp->len > MAX_URI_SIZE) return init_mi_tree(404, MI_SSTR("Contact is too long")); memcpy(contact, contactp->s, contactp->len); contact[contactp->len] = 0; if (allow_test(basename, uri, contact) == 1) { return init_mi_tree(200, MI_SSTR(MI_OK)); } else { return init_mi_tree(403, MI_SSTR("Forbidden")); } }
/*! \brief * RPC function to make allow_uri query. */ void rpc_test_uri(rpc_t* rpc, void* c) { str basenamep, urip, contactp; char basename[MAX_FILE_LEN + 1]; char uri[MAX_URI_SIZE + 1], contact[MAX_URI_SIZE + 1]; unsigned int allow_suffix_len; if (rpc->scan(c, "S", &basenamep) != 1) { rpc->fault(c, 500, "Not enough parameters (basename, URI and contact)"); return; } if (rpc->scan(c, "S", &urip) != 1) { rpc->fault(c, 500, "Not enough parameters (basename, URI and contact)"); return; } if (rpc->scan(c, "S", &contactp) != 1) { rpc->fault(c, 500, "Not enough parameters (basename, URI and contact)"); return; } /* For some reason, rtp->scan doesn't set the length properly */ if (contactp.len > MAX_URI_SIZE) { rpc->fault(c, 500, "Contact is too long"); return; } allow_suffix_len = strlen(allow_suffix); if (basenamep.len + allow_suffix_len + 1 > MAX_FILE_LEN) { rpc->fault(c, 500, "Basename is too long"); return; } memcpy(basename, basenamep.s, basenamep.len); memcpy(basename + basenamep.len, allow_suffix, allow_suffix_len); basename[basenamep.len + allow_suffix_len] = 0; memcpy(uri, urip.s, urip.len); memcpy(contact, contactp.s, contactp.len); contact[contactp.len] = 0; uri[urip.len] = 0; if (allow_test(basename, uri, contact) == 1) { rpc->rpl_printf(c, "Allowed"); return; } rpc->rpl_printf(c, "Denied"); return; }