]> git.saurik.com Git - apple/security.git/blobdiff - OSX/sec/securityd/SecDbQuery.h
Security-57336.1.9.tar.gz
[apple/security.git] / OSX / sec / securityd / SecDbQuery.h
diff --git a/OSX/sec/securityd/SecDbQuery.h b/OSX/sec/securityd/SecDbQuery.h
new file mode 100644 (file)
index 0000000..9bad114
--- /dev/null
@@ -0,0 +1,152 @@
+/*
+ * Copyright (c) 2013-2014 Apple Inc. All Rights Reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * This file contains Original Code and/or Modifications of Original Code
+ * as defined in and that are subject to the Apple Public Source License
+ * Version 2.0 (the 'License'). You may not use this file except in
+ * compliance with the License. Please obtain a copy of the License at
+ * http://www.opensource.apple.com/apsl/ and read it before using this
+ * file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
+ * Please see the License for the specific language governing rights and
+ * limitations under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+
+/*!
+ @header SecDbQuery.h - The thing that does the stuff with the gibli.
+ */
+
+#ifndef _SECURITYD_SECDBQUERY_H_
+#define _SECURITYD_SECDBQUERY_H_
+
+#include <securityd/SecKeybagSupport.h>
+#include <securityd/SecDbItem.h>
+
+__BEGIN_DECLS
+
+typedef struct Pair *SecDbPairRef;
+typedef struct Query *SecDbQueryRef;
+
+/* Return types. */
+typedef uint32_t ReturnTypeMask;
+enum
+{
+    kSecReturnDataMask = 1 << 0,
+    kSecReturnAttributesMask = 1 << 1,
+    kSecReturnRefMask = 1 << 2,
+    kSecReturnPersistentRefMask = 1 << 3,
+};
+
+/* Constant indicating there is no limit to the number of results to return. */
+enum
+{
+    kSecMatchUnlimited = kCFNotFound
+};
+
+typedef struct Pair
+{
+    const void *key;
+    const void *value;
+} Pair;
+
+/* Nothing in this struct is retained since all the
+ values below are extracted from the dictionary passed in by the
+ caller. */
+typedef struct Query
+{
+    /* Class of this query. */
+    const SecDbClass *q_class;
+
+    /* Dictionary with all attributes and values in clear (to be encrypted). */
+    CFMutableDictionaryRef q_item;
+
+    /* q_pairs is an array of Pair structs.  Elements with indices
+     [0, q_attr_end) contain attribute key value pairs.  Elements with
+     indices [q_match_begin, q_match_end) contain match key value pairs.
+     Thus q_attr_end is the number of attrs in q_pairs and
+     q_match_begin - q_match_end is the number of matches in q_pairs.  */
+    CFIndex q_match_begin;
+    CFIndex q_match_end;
+    CFIndex q_attr_end;
+
+    CFErrorRef q_error;
+    ReturnTypeMask q_return_type;
+
+    CFDataRef q_data;
+    CFTypeRef q_ref;
+    sqlite_int64 q_row_id;
+
+    CFArrayRef q_use_item_list;
+    CFBooleanRef q_use_tomb;
+#if defined(MULTIPLE_KEYCHAINS)
+    CFArrayRef q_use_keychain;
+    CFArrayRef q_use_keychain_list;
+#endif /* !defined(MULTIPLE_KEYCHAINS) */
+
+    /* Value of kSecMatchLimit key if present. */
+    CFIndex q_limit;
+
+    /* True if query contained a kSecAttrSynchronizable attribute,
+     * regardless of its actual value. If this is false, then we
+     * will add an explicit sync=0 to the query. */
+    bool q_sync;
+
+    // Set to true if we modified any item as part of executing this query
+    bool q_changed;
+
+    // Set to true if we modified any synchronizable item as part of executing this query
+    bool q_sync_changed;
+    
+    /* Keybag handle to use for this item. */
+    keybag_handle_t q_keybag;
+    
+    /* ACL and credHandle passed to the query. q_cred_handle contain LA context object. */
+    SecAccessControlRef q_access_control;
+    CFTypeRef q_use_cred_handle;
+    
+    // Flag indicating that ui-protected items should be simply skipped
+    // instead of reporting them to the client as an error.
+    bool q_skip_acl_items;
+
+    // SHA1 digest of DER encoded primary key
+    CFDataRef q_primary_key_digest;
+
+    CFArrayRef q_match_issuer;
+
+    /* Caller acces groups for AKS */
+    CFArrayRef q_caller_access_groups;
+
+    Pair q_pairs[];
+} Query;
+
+Query *query_create(const SecDbClass *qclass, CFDictionaryRef query, CFErrorRef *error);
+bool query_destroy(Query *q, CFErrorRef *error);
+bool query_error(Query *q, CFErrorRef *error);
+Query *query_create_with_limit(CFDictionaryRef query, CFIndex limit, CFErrorRef *error);
+void query_add_attribute(const void *key, const void *value, Query *q);
+void query_add_or_attribute(const void *key, const void *value, Query *q);
+void query_add_not_attribute(const void *key, const void *value, Query *q);
+void query_add_attribute_with_desc(const SecDbAttr *desc, const void *value, Query *q);
+void query_ensure_access_control(Query *q, CFStringRef agrp);
+void query_pre_add(Query *q, bool force_date);
+bool query_notify_and_destroy(Query *q, bool ok, CFErrorRef *error);
+CFIndex query_match_count(const Query *q);
+CFIndex query_attr_count(const Query *q);
+Pair query_attr_at(const Query *q, CFIndex ix);
+bool query_update_parse(Query *q, CFDictionaryRef update, CFErrorRef *error);
+const SecDbClass *kc_class_with_name(CFStringRef name);
+void query_set_caller_access_groups(Query *q, CFArrayRef caller_access_groups);
+
+
+__END_DECLS
+
+#endif /* _SECURITYD_SECDBQUERY_H_ */