2 * Copyright (c) 2013-2014 Apple Inc. All Rights Reserved.
4 * @APPLE_LICENSE_HEADER_START@
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. Please obtain a copy of the License at
10 * http://www.opensource.apple.com/apsl/ and read it before using this
13 * The Original Code and all software distributed under the License are
14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
18 * Please see the License for the specific language governing rights and
19 * limitations under the License.
21 * @APPLE_LICENSE_HEADER_END@
25 @header SecItemDb.h - A Database full of SecDbItems.
28 #ifndef _SECURITYD_SECITEMDB_H_
29 #define _SECURITYD_SECITEMDB_H_
31 #include <securityd/SecDbQuery.h>
37 // MARK: SecItemDb (a SecDb of SecDbItems)
39 typedef struct SecItemDb
*SecItemDbRef
;
40 typedef struct SecItemDbConnection
*SecItemDbConnectionRef
;
45 CFDictionaryRef classes
; // className -> SecItemClass mapping
48 struct SecItemDbConnection
{
49 SecDbConnectionRef db
;
52 SecItemDbRef
SecItemDbCreate(SecDbRef db
);
53 SecItemDbRef
SecItemDbRegisterClass(SecItemDbRef db
, const SecDbClass
*class, void(^upgrade
)(SecDbItemRef item
, uint32_t current_version
));
55 SecItemDbConnectionRef
SecItemDbAquireConnection(SecItemDbRef db
);
56 void SecItemDbReleaseConnection(SecItemDbRef db
, SecItemDbConnectionRef dbconn
);
58 bool SecItemDbInsert(SecItemDbConnectionRef dbconn
, SecDbItemRef item
, CFErrorRef
*error
);
60 bool SecItemDbDelete(SecItemDbConnectionRef dbconn
, SecDbItemRef item
, CFErrorRef
*error
);
62 // Low level update, just do the update
63 bool SecItemDbDoUpdate(SecItemDbConnectionRef dbconn
, SecDbItemRef old_item
, SecDbItemRef new_item
, CFErrorRef
*error
,
64 bool (^use_attr_in_where
)(const SecDbAttr
*attr
));
66 // High level update, will replace tombstones and create them if needed.
67 bool SecItemDbUpdate(SecItemDbConnectionRef dbconn
, SecDbItemRef old_item
, SecDbItemRef new_item
, CFErrorRef
*error
);
69 bool SecItemDbSelect(SecItemDbConnectionRef dbconn
, SecDbQueryRef query
, CFErrorRef
*error
,
70 bool (^use_attr_in_where
)(const SecDbAttr
*attr
),
71 bool (^add_where_sql
)(CFMutableStringRef sql
, bool *needWhere
),
72 bool (^bind_added_where
)(sqlite3_stmt
*stmt
, int col
),
73 void (^handle_row
)(SecDbItemRef item
, bool *stop
));
77 bool SecItemDbCreateSchema(SecDbConnectionRef dbt
, const SecDbSchema
*schema
, CFErrorRef
*error
);
79 bool SecItemDbDeleteSchema(SecDbConnectionRef dbt
, const SecDbSchema
*schema
, CFErrorRef
*error
);
81 CFTypeRef
SecDbItemCopyResult(SecDbItemRef item
, ReturnTypeMask return_type
, CFErrorRef
*error
);
83 bool SecDbItemSelect(SecDbQueryRef query
, SecDbConnectionRef dbconn
, CFErrorRef
*error
,
84 bool (^return_attr
)(const SecDbAttr
*attr
),
85 bool (^use_attr_in_where
)(const SecDbAttr
*attr
),
86 bool (^add_where_sql
)(CFMutableStringRef sql
, bool *needWhere
),
87 bool (^bind_added_where
)(sqlite3_stmt
*stmt
, int col
),
88 void (^handle_row
)(SecDbItemRef item
, bool *stop
));
90 CFStringRef
SecDbItemCopySelectSQL(SecDbQueryRef query
,
91 bool (^return_attr
)(const SecDbAttr
*attr
),
92 bool (^use_attr_in_where
)(const SecDbAttr
*attr
),
93 bool (^add_where_sql
)(CFMutableStringRef sql
, bool *needWhere
));
94 bool SecDbItemSelectBind(SecDbQueryRef query
, sqlite3_stmt
*stmt
, CFErrorRef
*error
,
95 bool (^use_attr_in_where
)(const SecDbAttr
*attr
),
96 bool (^bind_added_where
)(sqlite3_stmt
*stmt
, int col
));
98 bool SecDbItemQuery(SecDbQueryRef query
, CFArrayRef accessGroups
, SecDbConnectionRef dbconn
, CFErrorRef
*error
,
99 void (^handle_row
)(SecDbItemRef item
, bool *stop
));
101 void query_pre_add(Query
*q
, bool force_date
);
104 // MARK: backup restore stuff
107 /* Forward declaration of import export SPIs. */
110 kSecSysBoundItemFilter
,
111 kSecBackupableItemFilter
,
114 CF_RETURNS_RETAINED CFDictionaryRef
SecServerExportKeychainPlist(SecDbConnectionRef dbt
,
115 keybag_handle_t src_keybag
, keybag_handle_t dest_keybag
,
116 enum SecItemFilter filter
, CFErrorRef
*error
);
117 bool SecServerImportKeychainInPlist(SecDbConnectionRef dbt
,
118 keybag_handle_t src_keybag
, keybag_handle_t dest_keybag
,
119 CFDictionaryRef keychain
, enum SecItemFilter filter
, CFErrorRef
*error
);
121 bool kc_transaction(SecDbConnectionRef dbt
, CFErrorRef
*error
, bool(^perform
)());
122 bool s3dl_copy_matching(SecDbConnectionRef dbt
, Query
*q
, CFTypeRef
*result
,
123 CFArrayRef accessGroups
, CFErrorRef
*error
);
124 bool s3dl_query_add(SecDbConnectionRef dbt
, Query
*q
, CFTypeRef
*result
, CFErrorRef
*error
);
125 bool s3dl_query_update(SecDbConnectionRef dbt
, Query
*q
,
126 CFDictionaryRef attributesToUpdate
, CFArrayRef accessGroups
, CFErrorRef
*error
);
127 bool s3dl_query_delete(SecDbConnectionRef dbt
, Query
*q
, CFArrayRef accessGroups
, CFErrorRef
*error
);
128 const SecDbAttr
*SecDbAttrWithKey(const SecDbClass
*c
, CFTypeRef key
, CFErrorRef
*error
);
130 bool s3dl_dbt_keys_current(SecDbConnectionRef dbt
, uint32_t current_generation
, CFErrorRef
*error
);
131 bool s3dl_dbt_update_keys(SecDbConnectionRef dbt
, CFErrorRef
*error
);
135 #endif /* _SECURITYD_SECITEMDB_H_ */