summaryrefslogtreecommitdiffstats
path: root/libapol/src/policy-query-internal.h
diff options
context:
space:
mode:
Diffstat (limited to 'libapol/src/policy-query-internal.h')
-rw-r--r--libapol/src/policy-query-internal.h511
1 files changed, 511 insertions, 0 deletions
diff --git a/libapol/src/policy-query-internal.h b/libapol/src/policy-query-internal.h
new file mode 100644
index 0000000..657c815
--- /dev/null
+++ b/libapol/src/policy-query-internal.h
@@ -0,0 +1,511 @@
+/**
+ * @file
+ *
+ * Header for routines shared among libapol's queries and analyses.
+ * These routines are declared hidden within the library by way of the
+ * linking map.
+ *
+ * @author Jeremy A. Mowery jmowery@tresys.com
+ * @author Jason Tang jtang@tresys.com
+ *
+ * Copyright (C) 2006-2007 Tresys Technology, LLC
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef APOL_POLICY_QUERY_INTERNAL_H
+#define APOL_POLICY_QUERY_INTERNAL_H
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <config.h>
+
+#include <apol/policy.h>
+#include <apol/policy-query.h>
+#include <apol/util.h>
+#include <apol/vector.h>
+
+#include <regex.h>
+#include <stdlib.h>
+#include <qpol/policy.h>
+
+/* forward declaration. the definition resides within perm-map.c */
+ struct apol_permmap;
+
+/* forward declaration. the definition resides within domain-trans-analysis.c */
+ typedef struct apol_domain_trans_table apol_domain_trans_table_t;
+
+/* declared in perm-map.c */
+ typedef struct apol_permmap apol_permmap_t;
+
+ struct apol_policy
+ {
+ qpol_policy_t *p;
+ apol_callback_fn_t msg_callback;
+ void *msg_callback_arg;
+ int policy_type;
+ /** permission mapping for this policy; mappings loaded as needed */
+ struct apol_permmap *pmap;
+ /** for domain trans analysis; table built as needed */
+ struct apol_domain_trans_table *domain_trans_table;
+ };
+
+/** Every query allows the treatment of strings as regular expressions
+ * instead. Within the query structure are flags; if the first bit
+ * is set then use regex matching instead. */
+#define APOL_QUERY_REGEX 0x01
+
+#define APOL_QUERY_ONLY_ENABLED 0x10
+#define APOL_QUERY_SOURCE_AS_ANY 0x20
+#define APOL_QUERY_SOURCE_INDIRECT 0x40
+#define APOL_QUERY_TARGET_INDIRECT 0x80
+
+#define APOL_QUERY_SYMBOL_IS_BOTH (APOL_QUERY_SYMBOL_IS_TYPE|APOL_QUERY_SYMBOL_IS_ATTRIBUTE)
+#define APOL_QUERY_SOURCE_TYPE 0x100
+#define APOL_QUERY_SOURCE_ATTRIBUTE 0x200
+#define APOL_QUERY_TARGET_TYPE 0x400
+#define APOL_QUERY_TARGET_ATTRIBUTE 0x800
+
+#define APOL_QUERY_MATCH_ALL_PERMS 0x1000
+
+/**
+ * Destroy a compiled regular expression, setting it to NULL
+ * afterwards. Does nothing if the reference is NULL.
+ * @param regex Regular expression to destroy.
+ */
+ void apol_regex_destroy(regex_t ** regex);
+
+/**
+ * Sets a string field within a query, clearing its old contents and
+ * cached regex first. The search name will be duplicated.
+ *
+ * @param p Policy handler.
+ * @param search_name Reference to where to store duplicated name.
+ * @param regex Reference to cached regex; this will be cleared by the
+ * function.
+ * @param name New name to set, or NULL to just clear the field.
+ *
+ * @return 0 on success, < 0 on error.
+ */
+ int apol_query_set(const apol_policy_t * p, char **query_name, regex_t ** regex, const char *name);
+
+/**
+ * Sets an arbitrary flag for a query structure.
+ *
+ * @param p Policy handler.
+ * @param flags Reference to a flag bitmap.
+ * @param is_flag If non-zero, set flag. Otherwise unset it.
+ * @param flag_value Flag value to set.
+ *
+ * @return Always returns 0.
+ */
+ int apol_query_set_flag(const apol_policy_t * p, unsigned int *flags, const int is_flag, int flag_value);
+
+/**
+ * Sets the regular expression flag for a query structure.
+ *
+ * @param p Policy handler.
+ * @param flags Reference to the regular expression flag.
+ * @param is_regex If non-zero, set regex flag. Otherwise unset it.
+ *
+ * @return Always returns 0.
+ */
+ int apol_query_set_regex(const apol_policy_t * p, unsigned int *flags, const int is_regex);
+
+/**
+ * Determines if a name matches a target symbol name. If flags has
+ * the APOL_QUERY_REGEX bit set, then (1) compile the regular
+ * expression if NULL, and (2) apply it to target. Otherwise do a
+ * string comparison between name and target. If name is NULL and/or
+ * empty then the comparison always succeeds regardless of flags and
+ * regex.
+ *
+ * @param p Policy handler.
+ * @param target Name of target symbol to compare.
+ * @param name Source target from which to compare.
+ * @param flags If APOL_QUERY_REGEX bit is set, treat name as a
+ * regular expression.
+ * @param regex If using regexp comparison, the compiled regular
+ * expression to use; the pointer will be allocated space if regexp is
+ * legal. If NULL, then compile the regexp pattern given by name and
+ * cache it here.
+ *
+ * @return 1 If comparison succeeds, 0 if not; < 0 on error.
+ */
+ int apol_compare(const apol_policy_t * p, const char *target, const char *name, unsigned int flags, regex_t ** regex);
+
+/**
+ * Given an iterator of strings, checks if name matches any element
+ * within it. If there is a match, either literally or by regular
+ * expression, then return 1. If there are no matches then return 0.
+ *
+ * @param p Policy handler.
+ * @param iter Iterator of strings to match.
+ * @param name Source target from which to compare.
+ * @param flags If APOL_QUERY_REGEX bit is set, treat name as a
+ * regular expression.
+ * @param regex If using regexp comparison, the compiled regular
+ * expression to use; the pointer will be allocated space if regexp is
+ * legal. If NULL, then compile the regexp pattern given by name and
+ * cache it here.
+ * @param do_free If non-zero free the strings returned by the iterator.
+ *
+ * @return 1 If comparison succeeds, 0 if not; < 0 on error.
+ */
+ int apol_compare_iter(const apol_policy_t * p, qpol_iterator_t * iter, const char *name,
+ unsigned int flags, regex_t ** regex, int do_free);
+
+/**
+ * Determines if a (partial) type query matches a qpol_type_t,
+ * either the type name or any of its aliases.
+ *
+ * @param p Policy within which to look up types.
+ * @param type Type datum to compare against.
+ * @param name Source target from which to compare.
+ * @param flags If APOL_QUERY_REGEX bit is set, treat name as a
+ * regular expression.
+ * @param regex If using regexp comparison, the compiled regular
+ * expression to use; the pointer will be allocated space if regexp is
+ * legal. If NULL, then compile the regexp pattern given by name and
+ * cache it here.
+ *
+ * @return 1 If comparison succeeds, 0 if not; < 0 on error.
+ */
+ int apol_compare_type(const apol_policy_t * p, const qpol_type_t * type, const char *name, unsigned int flags,
+ regex_t ** type_regex);
+
+/**
+ * Determines if a (partial) permissive query matches a qpol_permissive_t,
+ * by name.
+ *
+ * @param p Policy within which to look up types.
+ * @param type Permissive datum to compare against.
+ * @param name Source target from which to compare.
+ * @param flags If APOL_QUERY_REGEX bit is set, treat name as a
+ * regular expression.
+ * @param regex If using regexp comparison, the compiled regular
+ * expression to use; the pointer will be allocated space if regexp is
+ * legal. If NULL, then compile the regexp pattern given by name and
+ * cache it here.
+ *
+ * @return 1 If comparison succeeds, 0 if not; < 0 on error.
+ */
+ int apol_compare_permissive(const apol_policy_t * p, const qpol_permissive_t * permissive, const char *name, unsigned int flags,
+ regex_t ** type_regex);
+
+/**
+ * Determines if a (partial) polcap query matches a qpol_polcap_t,
+ * by name.
+ *
+ * @param p Policy within which to look up types.
+ * @param type Polcap datum to compare against.
+ * @param name Source target from which to compare.
+ * @param flags If APOL_QUERY_REGEX bit is set, treat name as a
+ * regular expression.
+ * @param regex If using regexp comparison, the compiled regular
+ * expression to use; the pointer will be allocated space if regexp is
+ * legal. If NULL, then compile the regexp pattern given by name and
+ * cache it here.
+ *
+ * @return 1 If comparison succeeds, 0 if not; < 0 on error.
+ */
+ int apol_compare_polcap(const apol_policy_t * p, const qpol_polcap_t * polcap, const char *name, unsigned int flags,
+ regex_t ** type_regex);
+
+/**
+ * Determines if a boolean is used within a particual conditional.
+ *
+ * @param p Policy within which to look up types.
+ * @param cond Conditional to compare against.
+ * @param name Source boolean name from which to compare.
+ * @param flags If APOL_QUERY_REGEX bit is set, treat name as a
+ * regular expression.
+ * @param regex If using regexp comparison, the compiled regular
+ * expression to use; the pointer will be allocated space if regexp is
+ * legal. If NULL, then compile the regexp pattern given by name and
+ * cache it here.
+ *
+ * @return 1 If comparison succeeds, 0 if not; < 0 on error.
+ */
+ int apol_compare_cond_expr(const apol_policy_t * p, const qpol_cond_t * cond, const char *name, unsigned int flags,
+ regex_t ** bool_regex);
+
+/**
+ * Determines if a level query matches a qpol_level_t, either
+ * the sensitivity name or any of its aliases.
+ *
+ * @param p Policy within which to look up types.
+ * @param level level datum to compare against.
+ * @param name Source target from which to compare.
+ * @param flags If APOL_QUERY_REGEX bit is set, treat name as a
+ * regular expression.
+ * @param regex If using regexp comparison, the compiled regular
+ * expression to use; the pointer will be allocated space if regexp is
+ * legal. If NULL, then compile the regexp pattern given by name and
+ * cache it here.
+ *
+ * @return 1 If comparison succeeds, 0 if not; < 0 on error.
+ */
+ int apol_compare_level(const apol_policy_t * p, const qpol_level_t * level, const char *name, unsigned int flags,
+ regex_t ** level_regex);
+
+/**
+ * Determines if a category query matches a qpol_cat_t, either
+ * the category name or any of its aliases.
+ *
+ * @param p Policy within which to look up types.
+ * @param cat category datum to compare against.
+ * @param name Source target from which to compare.
+ * @param flags If APOL_QUERY_REGEX bit is set, treat name as a
+ * regular expression.
+ * @param regex If using regexp comparison, the compiled regular
+ * expression to use; the pointer will be allocated space if regexp is
+ * legal. If NULL, then compile the regexp pattern given by name and
+ * cache it here.
+ *
+ * @return 1 If comparison succeeds, 0 if not; < 0 on error.
+ */
+ int apol_compare_cat(const apol_policy_t * p, const qpol_cat_t * cat, const char *name, unsigned int flags,
+ regex_t ** cat_regex);
+
+/**
+ * Convenience function that compares a qpol_context_t to a
+ * apol_context_t, based upon the MLS range match given by flags. If
+ * search is NULL then the comparison always succeeds.
+ *
+ * @param p Policy within which to look up types.
+ * @param target Target context to compare.
+ * @param name Source context from which to compare.
+ * @param flags Gives how to match MLS ranges within the contexts.
+ *
+ * @return 1 If comparison succeeds, 0 if not; < 0 on error.
+ */
+ int apol_compare_context(const apol_policy_t * p, const qpol_context_t * target, const apol_context_t * search,
+ unsigned int flags);
+
+/**
+ * Given a type name, obtain its qpol_type_t pointer (relative to a
+ * policy). If the type is really its alias, get its primary instead.
+ * (Attributes are considered to be always primary.)
+ *
+ * @param p Policy in which to look up types.
+ * @param type_name Name of type to find.
+ * @param type Reference to where to store resulting pointer.
+ *
+ * @return 0 on success, < 0 on error.
+ */
+ int apol_query_get_type(const apol_policy_t * p, const char *type_name, const qpol_type_t ** type);
+
+/**
+ * Given a symbol name (a type, attribute, alias, or a regular
+ * expression string), determine all types/attributes it matches.
+ * Return a vector of qpol_type_t that match. If regex is enabled,
+ * include all types/attributes that match the expression. If
+ * indirect is enabled, expand the candidiates within the vector (all
+ * attributes for a type, all types for an attribute), and then
+ * uniquify the vector.
+ *
+ * @param p Policy in which to look up types.
+ * @param symbol A string describing one or more type/attribute to
+ * which match.
+ * @param do_regex If non-zero, then treat symbol as a regular expression.
+ * @param do_indirect If non-zero, expand types to their attributes
+ * and attributes to their types.
+ * @param ta_flag Bit-wise or of (APOL_QUERY_SYMBOL_IS_TYPE,
+ * APOL_QUERY_SYMBOL_IS_ATTRIBUTE, APOL_QUERY_SYMBOL_IS_BOTH) whether
+ * symbol should be matched against type names or attribute names.
+ *
+ * @return Vector of unique qpol_type_t pointers (relative to policy
+ * within p), or NULL upon error. Caller is responsible for calling
+ * apol_vector_destroy() afterwards.
+ */
+ apol_vector_t *apol_query_create_candidate_type_list(const apol_policy_t * p, const char *symbol, int do_regex,
+ int do_indirect, unsigned int ta_flag);
+
+/**
+ * Given a symbol name (a type, attribute, alias, or a regular
+ * expression string), determine all types/attributes it matches.
+ * Return a vector of qpol_type_t that match. If regex is enabled,
+ * include all types/attributes that match the expression. If
+ * indirect is enabled, expand the candidiates within the vector (all
+ * attributes for a type, all types for an attribute), and then
+ * uniquify the vector. The list will include types needed for syntactic
+ * rule searching.
+ *
+ * @param p Policy in which to look up types. <b>Must be a source policy.</b>
+ * @param symbol A string describing one or more type/attribute to
+ * which match.
+ * @param do_regex If non-zero, then treat symbol as a regular expression.
+ * @param do_indirect If non-zero, expand types to their attributes
+ * and attributes to their types.
+ * @param ta_flag Bit-wise or of (APOL_QUERY_SYMBOL_IS_TYPE,
+ * APOL_QUERY_SYMBOL_IS_ATTRIBUTE, APOL_QUERY_SYMBOL_IS_BOTH) whether
+ * symbol should be matched against type names or attribute names.
+ *
+ * @return Vector of unique qpol_type_t pointers (relative to policy
+ * within p), or NULL upon error. Caller is responsible for calling
+ * apol_vector_destroy() afterwards.
+ */
+ apol_vector_t *apol_query_create_candidate_syn_type_list(const apol_policy_t * p, const char *symbol, int do_regex,
+ int do_indirect, unsigned int ta_flag);
+
+/**
+ * Given a symbol name (a role or a regular expression string),
+ * determine all roles it matches. Return a vector of qpol_role_t
+ * that match. If regex is enabled, include all role that
+ * match the expression.
+ *
+ * @param p Policy in which to look up roles.
+ * @param symbol A string describing one or more role to match.
+ * @param do_regex If non-zero, then treat symbol as a regular expression.
+ *
+ * @return Vector of unique qpol_role_t pointers (relative to policy
+ * within p), or NULL upon error. Caller is responsible for calling
+ * apol_vector_destroy() afterwards.
+ */
+ apol_vector_t *apol_query_create_candidate_role_list(const apol_policy_t * p, char *symbol, int do_regex);
+
+/**
+ * Given a vector of object class strings, determine all of the
+ * classes it matches within the policy. Returns a vector of
+ * qpol_class_t that match. If a string does not match an object
+ * class within the policy then it is ignored.
+ *
+ * @param p Policy in which to look up classes.
+ * @param classes Vector of class strings to convert.
+ *
+ * @return Vector of unique qpol_class_t pointers (relative to policy
+ * within p), or NULL upon error. Caller is responsible for calling
+ * apol_vector_destroy() afterwards.
+ */
+ apol_vector_t *apol_query_create_candidate_class_list(const apol_policy_t * p, apol_vector_t * classes);
+
+/**
+ * Given a type, return a vector of qpol_type_t pointers to which the
+ * type expands. If the type is just a type or an alias, the vector
+ * will have one element, pointing to the type's primary. If it was
+ * an attribute, the vector will have that attribute's types (but not
+ * the attribute itself).
+ *
+ * @param p Policy in which to look up types.
+ * @param t Type to expand.
+ *
+ * @return Vector of qpol_type_t pointers, or NULL upon error. Caller
+ * is responsible for calling apol_vector_destroy() afterwards.
+ */
+ apol_vector_t *apol_query_expand_type(const apol_policy_t * p, const qpol_type_t * t);
+
+/**
+ * Object class and permission set.
+ * Contains the name of a class and a list of permissions
+ * used by analyses and complex searches to allow permissions
+ * to be specified on a per class basis.
+ */
+ typedef struct apol_obj_perm apol_obj_perm_t;
+
+/**
+ * Allocate and return a new object permission set.
+ * @return a newly allocated object permission set or NULL on error.
+ * Caller is responsible for calling apol_obj_perm_free() to free
+ * memory used.
+ */
+ apol_obj_perm_t *apol_obj_perm_create(void);
+
+/**
+ * Free the memory used by an object permission set.
+ * @param op the object permission set to free.
+ */
+ void apol_obj_perm_free(void *op);
+
+/**
+ * Set the object class name for an object permission set.
+ * If already set free the previous name.
+ * @param op The object permission set for which to set the object name.
+ * @param obj_name New object name to set; this string will be duplicated
+ * by this call. If NULL only free existing name (if any).
+ * @return 0 on success and < 0 on failure; if the call fails,
+ * errno will be set and the original object permission set will be unchanged.
+ */
+ int apol_obj_perm_set_obj_name(apol_obj_perm_t * op, const char *obj_name);
+
+/**
+ * Get the object class name from an object permission set.
+ * @param op The object permission set from which to get the class name.
+ * @return The class name or NULL if not set or error. The caller <b>should
+ * NOT</b> free the returned string.
+ */
+ char *apol_obj_perm_get_obj_name(const apol_obj_perm_t * op);
+
+/**
+ * Add a permission to the permission list of an object permission set.
+ * @param op The object permission set to which to add the permission.
+ * @param perm Name of the permission to add, this string will be duplicated.
+ * If NULL clear all permissions. If the permission is already in the list
+ * nothing is done;
+ * @return 0 on success and < 0 on failure; if the call fails,
+ * errno will be set and the original object permission set will be unchanged.
+ */
+ int apol_obj_perm_append_perm(apol_obj_perm_t * op, const char *perm);
+
+/**
+ * Get a vector of the permissions in an object permission set.
+ * @param op The object permission set from which to get the permissions.
+ * @return Vector (of type char *) of permission names; the caller
+ * <b>should NOT</b> destroy this vector.
+ */
+ apol_vector_t *apol_obj_perm_get_perm_vector(const apol_obj_perm_t * op);
+
+/**
+ * Comparision function for use with vectors of object permission sets.
+ * @param a first object permission set.
+ * @param b second object permission set.
+ * @param policy apol policy from which the objects and permissions come.
+ * @return < 0, 0, or > 0 if the value of the class of a is less than, equal
+ * to, or greater than that of b respectively.
+ */
+ int apol_obj_perm_compare_class(const void *a, const void *b, void *policy);
+
+/**
+ * Determine if a syntactic type set directly uses any of the types in v.
+ * @param p Policy from which the type set and types come.
+ * @param set Syntactic type set to check.
+ * @param v Vector of types (qpol_type_t) to find in set.
+ * @return 0 if no types in v appear in set, > 0 if at least one type
+ * was found, and < 0 if an error occurred.
+ */
+ int apol_query_type_set_uses_types_directly(const apol_policy_t * p, const qpol_type_set_t * set, const apol_vector_t * v);
+
+/**
+ * Deallocate all space associated with a particular policy's permmap,
+ * including the pointer itself. Afterwards set the pointer to NULL.
+ *
+ * @param p Reference to an apol_permmap_t to destroy.
+ */
+ void permmap_destroy(apol_permmap_t ** p);
+
+/**
+ * Destroy the domain transition table freeing all memory used.
+ * @param table Reference pointer to the table to be destroyed.
+ */
+ void domain_trans_table_destroy(apol_domain_trans_table_t ** table);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif