static svn_error_t * svn_ra_local__rev_prop(svn_ra_session_t *session, svn_revnum_t rev, const char *name, svn_string_t **value, apr_pool_t *pool) { svn_ra_local__session_baton_t *sess = session->priv; return svn_repos_fs_revision_prop(value, sess->repos, rev, name, NULL, NULL, pool); }
/* Set *PROPVAL to the value for the revision property PROPNAME on COMMITTED_REV, in the repository identified by RESOURCE, if RESOURCE's path is readable. If it is not readable, set *PROPVAL to NULL and return SVN_NO_ERROR. Use POOL for temporary allocations and the allocation of *PROPVAL. Note that this function does not check the readability of the revision property, but the readability of a path. The true readability of a revision property is determined by investigating the readability of all changed paths in the revision. For certain revision properties (e.g. svn:author and svn:date) to be readable, it is enough if at least one changed path is readable. When we already have a changed path, we can skip the check for the other changed paths in the revision and save a lot of work. This means that we will make a mistake when our path is unreadable and another changed path is readable, but we will at least only hide too much and not leak any protected properties. WARNING: This method of only checking the readability of a path is only valid to get revision properties for which it is enough if at least one changed path is readable. Using this function to get revision properties for which all changed paths must be readable might leak protected information because we will only test the readability of a single changed path. */ static svn_error_t * get_path_revprop(svn_string_t **propval, const dav_resource *resource, svn_revnum_t committed_rev, const char *propname, apr_pool_t *pool) { *propval = NULL; if (! dav_svn__allow_read_resource(resource, committed_rev, pool)) return SVN_NO_ERROR; /* Get the property of the created revision. The authz is already performed, so we don't need to do it here too. */ return svn_repos_fs_revision_prop(propval, resource->info->repos->repos, committed_rev, propname, NULL, NULL, pool); }
static int db_exists(dav_db *db, const dav_prop_name *name) { const char *propname; svn_string_t *propval; svn_error_t *serr; int retval; /* get the repos-local name */ get_repos_propname(db, name, &propname); /* ### non-svn props aren't in our repos */ if (propname == NULL) return 0; /* Working Baseline, Baseline, or (Working) Version resource */ if (db->resource->baselined) if (db->resource->type == DAV_RESOURCE_TYPE_WORKING) serr = svn_fs_txn_prop(&propval, db->resource->info->root.txn, propname, db->p); else serr = svn_repos_fs_revision_prop(&propval, db->resource->info->repos->repos, db->resource->info->root.rev, propname, db->authz_read_func, db->authz_read_baton, db->p); else serr = svn_fs_node_prop(&propval, db->resource->info->root.root, get_repos_path(db->resource->info), propname, db->p); /* ### try and dispose of the value? */ retval = (serr == NULL && propval != NULL); svn_error_clear(serr); return retval; }
static dav_error * get_value(dav_db *db, const dav_prop_name *name, svn_string_t **pvalue) { const char *propname; svn_error_t *serr; /* get the repos-local name */ get_repos_propname(db, name, &propname); if (propname == NULL) { /* we know these are not present. */ *pvalue = NULL; return NULL; } /* ### if db->props exists, then try in there first */ /* We've got three different types of properties (node, txn, and revision), and we've got two different protocol versions to deal with. Let's try to make some sense of this, shall we? HTTP v1: working baseline ('wbl') resource -> txn prop change non-working, baselined resource ('bln') -> rev prop change [*] working, non-baselined resource ('wrk') -> node prop change HTTP v2: transaction resource ('txn') -> txn prop change revision resource ('rev') -> rev prop change transaction root resource ('txr') -> node prop change [*] This is a violation of the DeltaV spec (### see issue #916). */ if (db->resource->baselined) { if (db->resource->type == DAV_RESOURCE_TYPE_WORKING) serr = svn_fs_txn_prop(pvalue, db->resource->info->root.txn, propname, db->p); else serr = svn_repos_fs_revision_prop(pvalue, db->resource->info-> repos->repos, db->resource->info->root.rev, propname, db->authz_read_func, db->authz_read_baton, db->p); } else if (db->resource->info->restype == DAV_SVN_RESTYPE_TXN_COLLECTION) { serr = svn_fs_txn_prop(pvalue, db->resource->info->root.txn, propname, db->p); } else { serr = svn_fs_node_prop(pvalue, db->resource->info->root.root, get_repos_path(db->resource->info), propname, db->p); } if (serr != NULL) return dav_svn__convert_err(serr, HTTP_INTERNAL_SERVER_ERROR, "could not fetch a property", db->resource->pool); return NULL; }