summaryrefslogtreecommitdiffstats
path: root/src/db/sysdb_private.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/db/sysdb_private.h')
-rw-r--r--src/db/sysdb_private.h317
1 files changed, 317 insertions, 0 deletions
diff --git a/src/db/sysdb_private.h b/src/db/sysdb_private.h
new file mode 100644
index 0000000..1f55007
--- /dev/null
+++ b/src/db/sysdb_private.h
@@ -0,0 +1,317 @@
+
+/*
+ SSSD
+
+ Private System Database Header
+
+ Copyright (C) Simo Sorce <ssorce@redhat.com> 2008
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef __INT_SYS_DB_H__
+#define __INT_SYS_DB_H__
+
+#define SYSDB_VERSION_0_23 "0.23"
+#define SYSDB_VERSION_0_22 "0.22"
+#define SYSDB_VERSION_0_21 "0.21"
+#define SYSDB_VERSION_0_20 "0.20"
+#define SYSDB_VERSION_0_19 "0.19"
+#define SYSDB_VERSION_0_18 "0.18"
+#define SYSDB_VERSION_0_17 "0.17"
+#define SYSDB_VERSION_0_16 "0.16"
+#define SYSDB_VERSION_0_15 "0.15"
+#define SYSDB_VERSION_0_14 "0.14"
+#define SYSDB_VERSION_0_13 "0.13"
+#define SYSDB_VERSION_0_12 "0.12"
+#define SYSDB_VERSION_0_11 "0.11"
+#define SYSDB_VERSION_0_10 "0.10"
+#define SYSDB_VERSION_0_9 "0.9"
+#define SYSDB_VERSION_0_8 "0.8"
+#define SYSDB_VERSION_0_7 "0.7"
+#define SYSDB_VERSION_0_6 "0.6"
+#define SYSDB_VERSION_0_5 "0.5"
+#define SYSDB_VERSION_0_4 "0.4"
+#define SYSDB_VERSION_0_3 "0.3"
+#define SYSDB_VERSION_0_2 "0.2"
+#define SYSDB_VERSION_0_1 "0.1"
+
+#define SYSDB_VERSION SYSDB_VERSION_0_23
+
+#define SYSDB_BASE_LDIF \
+ "dn: @ATTRIBUTES\n" \
+ "userPrincipalName: CASE_INSENSITIVE\n" \
+ "canonicalUserPrincipalName: CASE_INSENSITIVE\n" \
+ "cn: CASE_INSENSITIVE\n" \
+ "dc: CASE_INSENSITIVE\n" \
+ "dn: CASE_INSENSITIVE\n" \
+ "originalDN: CASE_INSENSITIVE\n" \
+ "objectclass: CASE_INSENSITIVE\n" \
+ "ipHostNumber: CASE_INSENSITIVE\n" \
+ "ipNetworkNumber: CASE_INSENSITIVE\n" \
+ "\n" \
+ "dn: @INDEXLIST\n" \
+ "@IDXATTR: cn\n" \
+ "@IDXATTR: objectclass\n" \
+ "@IDXATTR: member\n" \
+ "@IDXATTR: memberof\n" \
+ "@IDXATTR: name\n" \
+ "@IDXATTR: uidNumber\n" \
+ "@IDXATTR: gidNumber\n" \
+ "@IDXATTR: lastUpdate\n" \
+ "@IDXATTR: dataExpireTimestamp\n" \
+ "@IDXATTR: originalDN\n" \
+ "@IDXATTR: nameAlias\n" \
+ "@IDXATTR: servicePort\n" \
+ "@IDXATTR: serviceProtocol\n" \
+ "@IDXATTR: sudoUser\n" \
+ "@IDXATTR: sshKnownHostsExpire\n" \
+ "@IDXATTR: objectSIDString\n" \
+ "@IDXATTR: ghost\n" \
+ "@IDXATTR: userPrincipalName\n" \
+ "@IDXATTR: canonicalUserPrincipalName\n" \
+ "@IDXATTR: uniqueID\n" \
+ "@IDXATTR: mail\n" \
+ "@IDXATTR: userMappedCertificate\n" \
+ "@IDXATTR: ccacheFile\n" \
+ "@IDXATTR: ipHostNumber\n" \
+ "@IDXATTR: ipNetworkNumber\n" \
+ "@IDXATTR: originalADgidNumber\n" \
+ "\n" \
+ "dn: @MODULES\n" \
+ "@LIST: asq,memberof\n" \
+ "\n" \
+ "dn: cn=sysdb\n" \
+ "cn: sysdb\n" \
+ "version: " SYSDB_VERSION "\n" \
+ "description: base object\n" \
+ "\n" \
+ "dn: cn=ranges,cn=sysdb\n" \
+ "cn: ranges\n" \
+ "\n"
+
+/* The timestamp cache has its own versioning */
+#define SYSDB_TS_VERSION_0_2 "0.2"
+#define SYSDB_TS_VERSION_0_1 "0.1"
+
+#define SYSDB_TS_VERSION SYSDB_TS_VERSION_0_2
+
+#define SYSDB_TS_BASE_LDIF \
+ "dn: @ATTRIBUTES\n" \
+ "dn: CASE_INSENSITIVE\n" \
+ "\n" \
+ "dn: @INDEXLIST\n" \
+ "@IDXATTR: lastUpdate\n" \
+ "@IDXATTR: dataExpireTimestamp\n" \
+ "\n" \
+ "dn: cn=sysdb\n" \
+ "cn: sysdb\n" \
+ "version: " SYSDB_TS_VERSION "\n" \
+ "description: base object\n" \
+ "\n" \
+
+#include "db/sysdb.h"
+
+struct sysdb_ctx {
+ struct ldb_context *ldb;
+ char *ldb_file;
+
+ struct ldb_context *ldb_ts;
+ char *ldb_ts_file;
+
+ int transaction_nesting;
+};
+
+/* Internal utility functions */
+int sysdb_get_db_file(TALLOC_CTX *mem_ctx,
+ const char *provider,
+ const char *name,
+ const char *base_path,
+ char **_ldb_file,
+ char **_ts_file);
+errno_t sysdb_ldb_connect(TALLOC_CTX *mem_ctx,
+ const char *filename,
+ int flags,
+ struct ldb_context **_ldb);
+errno_t sysdb_ldb_mod_index(TALLOC_CTX *mem_ctx,
+ enum sysdb_index_actions action,
+ struct ldb_context *ldb,
+ const char *attribute);
+errno_t sysdb_manage_index(TALLOC_CTX *mem_ctx,
+ enum sysdb_index_actions action,
+ const char *name,
+ const char *attribute,
+ const char ***indexes);
+struct sysdb_dom_upgrade_ctx {
+ struct sss_names_ctx *names; /* upgrade to 0.18 needs to parse names */
+};
+
+int sysdb_domain_init_internal(TALLOC_CTX *mem_ctx,
+ struct sss_domain_info *domain,
+ const char *db_path,
+ struct sysdb_dom_upgrade_ctx *upgrade_ctx,
+ struct sysdb_ctx **_ctx);
+
+/* Upgrade routines */
+int sysdb_upgrade_01(struct ldb_context *ldb, const char **ver);
+int sysdb_check_upgrade_02(struct sss_domain_info *domains,
+ const char *db_path);
+int sysdb_upgrade_03(struct sysdb_ctx *sysdb, const char **ver);
+int sysdb_upgrade_04(struct sysdb_ctx *sysdb, const char **ver);
+int sysdb_upgrade_05(struct sysdb_ctx *sysdb, const char **ver);
+int sysdb_upgrade_06(struct sysdb_ctx *sysdb, const char **ver);
+int sysdb_upgrade_07(struct sysdb_ctx *sysdb, const char **ver);
+int sysdb_upgrade_08(struct sysdb_ctx *sysdb, const char **ver);
+int sysdb_upgrade_09(struct sysdb_ctx *sysdb, const char **ver);
+int sysdb_upgrade_10(struct sysdb_ctx *sysdb, struct sss_domain_info *domain,
+ const char **ver);
+int sysdb_upgrade_11(struct sysdb_ctx *sysdb, struct sss_domain_info *domain,
+ const char **ver);
+int sysdb_upgrade_12(struct sysdb_ctx *sysdb, const char **ver);
+int sysdb_upgrade_13(struct sysdb_ctx *sysdb, const char **ver);
+int sysdb_upgrade_14(struct sysdb_ctx *sysdb, const char **ver);
+int sysdb_upgrade_15(struct sysdb_ctx *sysdb, const char **ver);
+int sysdb_upgrade_16(struct sysdb_ctx *sysdb, const char **ver);
+int sysdb_upgrade_17(struct sysdb_ctx *sysdb,
+ struct sysdb_dom_upgrade_ctx *upgrade_ctx,
+ const char **ver);
+int sysdb_upgrade_18(struct sysdb_ctx *sysdb, const char **ver);
+int sysdb_upgrade_19(struct sysdb_ctx *sysdb, const char **ver);
+int sysdb_upgrade_20(struct sysdb_ctx *sysdb, const char **ver);
+int sysdb_upgrade_21(struct sysdb_ctx *sysdb, const char **ver);
+int sysdb_upgrade_22(struct sysdb_ctx *sysdb, const char **ver);
+
+int sysdb_ts_upgrade_01(struct sysdb_ctx *sysdb, const char **ver);
+
+int sysdb_add_string(struct ldb_message *msg,
+ const char *attr, const char *value);
+int sysdb_replace_string(struct ldb_message *msg,
+ const char *attr, const char *value);
+int sysdb_delete_string(struct ldb_message *msg,
+ const char *attr, const char *value);
+int sysdb_add_ulong(struct ldb_message *msg,
+ const char *attr, unsigned long value);
+int sysdb_replace_ulong(struct ldb_message *msg,
+ const char *attr, unsigned long value);
+int sysdb_delete_ulong(struct ldb_message *msg,
+ const char *attr, unsigned long value);
+
+/* Helper functions to deal with the timestamp cache should not be used
+ * outside the sysdb itself. The timestamp cache should be completely
+ * opaque to the sysdb consumers
+ */
+
+/* Returns true if the 'dn' parameter is a user or a group DN, because
+ * at the moment, the timestamps cache only handles users and groups.
+ * Returns false otherwise.
+ */
+bool is_ts_ldb_dn(struct ldb_dn *dn);
+
+/* Returns true if the attrname is an attribute we store to the timestamp
+ * cache, false if it's a sysdb-only attribute
+ */
+bool is_ts_cache_attr(const char *attrname);
+
+/* Returns a subset of attrs that only contains the attributes we store to
+ * the timestamps cache. Useful in generic functions that set some attributes
+ * and we want to mirror that change in the timestamps cache
+ */
+struct sysdb_attrs *sysdb_filter_ts_attrs(TALLOC_CTX *mem_ctx,
+ struct sysdb_attrs *attrs);
+
+/* Given a ldb_result found in the timestamp cache, merge in the
+ * corresponding full attributes from the sysdb cache. The new
+ * attributes are allocated on the messages in the ldb_result.
+ */
+errno_t sysdb_merge_res_ts_attrs(struct sysdb_ctx *ctx,
+ struct ldb_result *res,
+ const char *attrs[]);
+
+/* Given an array of ldb_message structures found in the timestamp cache,
+ * merge in the corresponding full attributes from the sysdb cache. The
+ * new attributes are allocated atop the ldb messages.
+ */
+errno_t sysdb_merge_msg_list_ts_attrs(struct sysdb_ctx *ctx,
+ size_t msgs_count,
+ struct ldb_message **msgs,
+ const char *attrs[]);
+
+/* Merge two sets of ldb_result structures. */
+struct ldb_result *sss_merge_ldb_results(struct ldb_result *res,
+ struct ldb_result *subres);
+
+/* Search Entry in an ldb cache */
+int sysdb_cache_search_entry(TALLOC_CTX *mem_ctx,
+ struct ldb_context *ldb,
+ struct ldb_dn *base_dn,
+ enum ldb_scope scope,
+ const char *filter,
+ const char **attrs,
+ size_t *_msgs_count,
+ struct ldb_message ***_msgs);
+
+/* Search Entry in the timestamp cache */
+int sysdb_search_ts_entry(TALLOC_CTX *mem_ctx,
+ struct sysdb_ctx *sysdb,
+ struct ldb_dn *base_dn,
+ enum ldb_scope scope,
+ const char *filter,
+ const char **attrs,
+ size_t *_msgs_count,
+ struct ldb_message ***_msgs);
+
+int sysdb_search_ts_users(TALLOC_CTX *mem_ctx,
+ struct sss_domain_info *domain,
+ const char *sub_filter,
+ const char **attrs,
+ struct ldb_result *res);
+
+int sysdb_search_ts_groups(TALLOC_CTX *mem_ctx,
+ struct sss_domain_info *domain,
+ const char *sub_filter,
+ const char **attrs,
+ struct ldb_result *res);
+
+errno_t sysdb_search_ts_matches(TALLOC_CTX *mem_ctx,
+ struct sysdb_ctx *sysdb,
+ const char *attrs[],
+ struct ldb_result *ts_res,
+ const char *filter,
+ struct ldb_result **_res);
+
+/* Compares the modifyTimestamp attribute between old_entry and
+ * new_entry. Returns true if they differ (or either entry is missing
+ * the attribute) and false if the attribute is the same
+ */
+bool sysdb_msg_attrs_modts_differs(struct ldb_message *old_entry,
+ struct sysdb_attrs *new_entry);
+
+/* Given a sysdb_attrs pointer, returns a corresponding ldb_message */
+struct ldb_message *sysdb_attrs2msg(TALLOC_CTX *mem_ctx,
+ struct ldb_dn *entry_dn,
+ struct sysdb_attrs *attrs,
+ int mod_op);
+
+/* Compares the attributes between the existing attributes of entry_dn and
+ * the new_entry attributes that are about to be set. If the set would
+ * not yield into any differences (and therefore a write to the cache is
+ * not necessary), the function returns false (no diff), otherwise
+ * the function returns true (a difference exists).
+ */
+bool sysdb_entry_attrs_diff(struct sysdb_ctx *sysdb,
+ struct ldb_dn *entry_dn,
+ struct sysdb_attrs *attrs,
+ int mod_op);
+
+#endif /* __INT_SYS_DB_H__ */