APU_DECLARE(void) apr_xml_quote_elem(apr_pool_t *p, apr_xml_elem *elem) { apr_text *scan_txt; apr_xml_attr *scan_attr; apr_xml_elem *scan_elem; /* convert the element's text */ for (scan_txt = elem->first_cdata.first; scan_txt != NULL; scan_txt = scan_txt->next) { scan_txt->text = apr_xml_quote_string(p, scan_txt->text, 0); } for (scan_txt = elem->following_cdata.first; scan_txt != NULL; scan_txt = scan_txt->next) { scan_txt->text = apr_xml_quote_string(p, scan_txt->text, 0); } /* convert the attribute values */ for (scan_attr = elem->attr; scan_attr != NULL; scan_attr = scan_attr->next) { scan_attr->value = apr_xml_quote_string(p, scan_attr->value, 1); } /* convert the child elements */ for (scan_elem = elem->first_child; scan_elem != NULL; scan_elem = scan_elem->next) { apr_xml_quote_elem(p, scan_elem); } }
static dav_error * dav_propdb_store(dav_db *db, const dav_prop_name *name, const apr_xml_elem *elem, dav_namespace_map *mapping) { apr_datum_t key = dav_build_key(db, name); apr_datum_t value; /* Note: mapping->ns_map was set up in dav_propdb_map_namespaces() */ /* ### use a db- subpool for these values? clear on exit? */ /* quote all the values in the element */ /* ### be nice to do this without affecting the element itself */ /* ### of course, the cast indicates Badness is occurring here */ apr_xml_quote_elem(db->pool, (apr_xml_elem *)elem); /* generate a text blob for the xml:lang plus the contents */ apr_xml_to_text(db->pool, elem, APR_XML_X2T_LANG_INNER, NULL, mapping->ns_map, (const char **)&value.dptr, &value.dsize); return dav_dbm_store(db, key, value); }
/* ** dav_lock_parse_lockinfo: Validates the given xml_doc to contain a ** lockinfo XML element, then populates a dav_lock structure ** with its contents. */ DAV_DECLARE(dav_error *) dav_lock_parse_lockinfo(request_rec *r, const dav_resource *resource, dav_lockdb *lockdb, const apr_xml_doc *doc, dav_lock **lock_request) { apr_pool_t *p = r->pool; dav_error *err; apr_xml_elem *child; dav_lock *lock; if (!dav_validate_root(doc, "lockinfo")) { return dav_new_error(p, HTTP_BAD_REQUEST, 0, "The request body contains an unexpected " "XML root element."); } if ((err = (*lockdb->hooks->create_lock)(lockdb, resource, &lock)) != NULL) { return dav_push_error(p, err->status, 0, "Could not parse the lockinfo due to an " "internal problem creating a lock structure.", err); } lock->depth = dav_get_depth(r, DAV_INFINITY); if (lock->depth == -1) { return dav_new_error(p, HTTP_BAD_REQUEST, 0, "An invalid Depth header was specified."); } lock->timeout = dav_get_timeout(r); /* Parse elements in the XML body */ for (child = doc->root->first_child; child; child = child->next) { if (strcmp(child->name, "locktype") == 0 && child->first_child && lock->type == DAV_LOCKTYPE_UNKNOWN) { if (strcmp(child->first_child->name, "write") == 0) { lock->type = DAV_LOCKTYPE_WRITE; continue; } } if (strcmp(child->name, "lockscope") == 0 && child->first_child && lock->scope == DAV_LOCKSCOPE_UNKNOWN) { if (strcmp(child->first_child->name, "exclusive") == 0) lock->scope = DAV_LOCKSCOPE_EXCLUSIVE; else if (strcmp(child->first_child->name, "shared") == 0) lock->scope = DAV_LOCKSCOPE_SHARED; if (lock->scope != DAV_LOCKSCOPE_UNKNOWN) continue; } if (strcmp(child->name, "owner") == 0 && lock->owner == NULL) { const char *text; /* quote all the values in the <DAV:owner> element */ apr_xml_quote_elem(p, child); /* ** Store a full <DAV:owner> element with namespace definitions ** and an xml:lang definition, if applicable. */ apr_xml_to_text(p, child, APR_XML_X2T_FULL_NS_LANG, doc->namespaces, NULL, &text, NULL); lock->owner = text; continue; } return dav_new_error(p, HTTP_PRECONDITION_FAILED, 0, apr_psprintf(p, "The server cannot satisfy the " "LOCK request due to an unknown XML " "element (\"%s\") within the " "DAV:lockinfo element.", child->name)); } *lock_request = lock; return NULL; }