2 ldb database library - Samba3 SAM compatibility backend
4 Copyright (C) Jelmer Vernooij 2005
8 #include "ldb/modules/ldb_map.h"
9 #include "ldb/include/ldb.h"
10 #include "ldb/include/ldb_private.h"
11 #include "librpc/gen_ndr/ndr_security.h"
14 * sambaSID -> member (dn!)
15 * sambaSIDList -> member (dn!)
16 * sambaDomainName -> name
22 * sambaAcctFlags -> systemFlags ?
23 * sambaPasswordHistory -> ntPwdHistory*/
31 * sambaAlgorithmicRidBase
42 * sambaUserWorkstations
46 /* In Samba4 but not in Samba3:
49 static struct ldb_val convert_sid_rid(struct ldb_module *module, TALLOC_CTX *ctx, const struct ldb_val *val)
51 printf("Converting SID TO RID *\n");
55 return ldb_val_dup(ctx, val);
58 static struct ldb_val convert_rid_sid(struct ldb_module *module, TALLOC_CTX *ctx, const struct ldb_val *val)
60 printf("Converting RID TO SID *\n");
64 return ldb_val_dup(ctx, val);
67 static struct ldb_val convert_unix_id2name(struct ldb_module *module, TALLOC_CTX *ctx, const struct ldb_val *val)
69 printf("Converting UNIX ID to name\n");
73 return ldb_val_dup(ctx, val);
76 static struct ldb_val convert_unix_name2id(struct ldb_module *module, TALLOC_CTX *ctx, const struct ldb_val *val)
78 printf("Converting UNIX name to ID\n");
82 return ldb_val_dup(ctx, val);
85 static struct ldb_val encode_sid(struct ldb_module *module, TALLOC_CTX *ctx, const struct ldb_val *val)
87 struct dom_sid *sid = dom_sid_parse_talloc(ctx, (char *)val->data);
88 struct ldb_val *out = talloc_zero(ctx, struct ldb_val);
94 status = ndr_push_struct_blob(out, ctx, sid,
95 (ndr_push_flags_fn_t)ndr_push_dom_sid);
97 if (!NT_STATUS_IS_OK(status)) {
104 static struct ldb_val decode_sid(struct ldb_module *module, TALLOC_CTX *ctx, const struct ldb_val *val)
108 struct ldb_val *out = talloc_zero(ctx, struct ldb_val);
110 sid = talloc(ctx, struct dom_sid);
114 status = ndr_pull_struct_blob(val, sid, sid,
115 (ndr_pull_flags_fn_t)ndr_pull_dom_sid);
116 if (!NT_STATUS_IS_OK(status)) {
120 out->data = (uint8_t *)dom_sid_string(ctx, sid);
122 if (out->data == NULL) {
125 out->length = strlen((const char *)out->data);
130 const struct ldb_map_objectclass samba3_objectclasses[] = {
132 .local_name = "group",
133 .remote_name = "sambaGroupMapping",
134 .musts = { "gidNumber", "sambaSID", "sambaGroupType", NULL },
135 .mays = { "displayName", "description", "sambaSIDList", NULL },
138 .local_name = "user",
139 .remote_name = "sambaSAMAccount",
140 .base_classes = { "top", NULL },
141 .musts = { "uid", "sambaSID", NULL },
142 .mays = { "cn", "sambaLMPassword", "sambaNTPassword",
143 "sambaPwdLastSet", "sambaLogonTime", "sambaLogoffTime",
144 "sambaKickoffTime", "sambaPwdCanChange", "sambaPwdMustChange",
145 "sambaAcctFlags", "displayName", "sambaHomePath", "sambaHomeDrive",
146 "sambaLogonScript", "sambaProfilePath", "description", "sambaUserWorkstations",
147 "sambaPrimaryGroupSID", "sambaDomainName", "sambaMungedDial",
148 "sambaBadPasswordCount", "sambaBadPasswordTime",
149 "sambaPasswordHistory", "sambaLogonHours", NULL }
153 .local_name = "domain",
154 .remote_name = "sambaDomain",
155 .base_classes = { "top", NULL },
156 .musts = { "sambaDomainName", "sambaSID", NULL },
157 .mays = { "sambaNextRid", "sambaNextGroupRid", "sambaNextUserRid", "sambaAlgorithmicRidBase", NULL },
162 const struct ldb_map_attribute samba3_attributes[] =
164 /* sambaNextRid -> nextRid */
166 .local_name = "nextRid",
170 .remote_name = "sambaNextRid",
175 /* sambaBadPasswordTime -> badPasswordtime*/
177 .local_name = "badPasswordTime",
181 .remote_name = "sambaBadPasswordTime",
186 /* sambaLMPassword -> lmPwdHash*/
188 .local_name = "lmPwdHash",
192 .remote_name = "sambaLMPassword",
197 /* sambaGroupType -> groupType */
199 .local_name = "groupType",
203 .remote_name = "sambaGroupType",
208 /* sambaNTPassword -> ntPwdHash*/
210 .local_name = "ntPwdHash",
214 .remote_name = "sambaNTPassword",
219 /* sambaPrimaryGroupSID -> primaryGroupID */
221 .local_name = "primaryGroupID",
225 .remote_name = "sambaPrimaryGroupSID",
226 .convert_local = convert_rid_sid,
227 .convert_remote = convert_sid_rid,
232 /* sambaBadPasswordCount -> badPwdCount */
234 .local_name = "badPwdCount",
238 .remote_name = "sambaBadPasswordCount",
243 /* sambaLogonTime -> lastLogon*/
245 .local_name = "lastLogon",
249 .remote_name = "sambaLogonTime",
254 /* sambaLogoffTime -> lastLogoff*/
256 .local_name = "lastLogoff",
260 .remote_name = "sambaLogoffTime",
265 /* uid -> unixName */
267 .local_name = "unixName",
271 .remote_name = "uid",
276 /* displayName -> name */
278 .local_name = "name",
282 .remote_name = "displayName",
293 /* sAMAccountName -> cn */
295 .local_name = "sAMAccountName",
299 .remote_name = "uid",
306 .local_name = "objectCategory",
312 .local_name = "objectGUID",
318 .local_name = "objectVersion",
324 .local_name = "codePage",
330 .local_name = "dNSHostName",
337 .local_name = "dnsDomain",
343 .local_name = "dnsRoot",
349 .local_name = "countryCode",
355 .local_name = "nTMixedDomain",
359 /* operatingSystem */
361 .local_name = "operatingSystem",
365 /* operatingSystemVersion */
367 .local_name = "operatingSystemVersion",
372 /* servicePrincipalName */
374 .local_name = "servicePrincipalName",
378 /* msDS-Behavior-Version */
380 .local_name = "msDS-Behavior-Version",
384 /* msDS-KeyVersionNumber */
386 .local_name = "msDS-KeyVersionNumber",
390 /* msDs-masteredBy */
392 .local_name = "msDs-masteredBy",
410 .local_name = "description",
414 /* sambaSID -> objectSid*/
416 .local_name = "objectSid",
420 .remote_name = "sambaSID",
421 .convert_local = decode_sid,
422 .convert_remote = encode_sid,
427 /* sambaPwdLastSet -> pwdLastSet */
429 .local_name = "pwdLastSet",
433 .remote_name = "sambaPwdLastSet",
440 .local_name = "accountExpires",
446 .local_name = "adminCount",
452 .local_name = "canonicalName",
456 /* createTimestamp */
458 .local_name = "createTimestamp",
464 .local_name = "creationTime",
470 .local_name = "dMDLocation",
476 .local_name = "fSMORoleOwner",
482 .local_name = "forceLogoff",
488 .local_name = "instanceType",
494 .local_name = "invocationId",
498 /* isCriticalSystemObject */
500 .local_name = "isCriticalSystemObject",
504 /* localPolicyFlags */
506 .local_name = "localPolicyFlags",
510 /* lockOutObservationWindow */
512 .local_name = "lockOutObservationWindow",
516 /* lockoutDuration */
518 .local_name = "lockoutDuration",
522 /* lockoutThreshold */
524 .local_name = "lockoutThreshold",
530 .local_name = "logonCount",
536 .local_name = "masteredBy",
542 .local_name = "maxPwdAge",
548 .local_name = "member",
554 .local_name = "memberOf",
560 .local_name = "minPwdAge",
566 .local_name = "minPwdLength",
572 .local_name = "modifiedCount",
576 /* modifiedCountAtLastProm */
578 .local_name = "modifiedCountAtLastProm",
582 /* modifyTimestamp */
584 .local_name = "modifyTimestamp",
590 .local_name = "nCName",
596 .local_name = "nETBIOSName",
602 .local_name = "oEMInformation",
608 .local_name = "privilege",
612 /* pwdHistoryLength */
614 .local_name = "pwdHistoryLength",
620 .local_name = "pwdProperties",
624 /* rIDAvailablePool */
626 .local_name = "rIDAvailablePool",
632 .local_name = "revision",
636 /* ridManagerReference */
638 .local_name = "ridManagerReference",
644 .local_name = "sAMAccountType",
650 .local_name = "sPNMappings",
654 /* serverReference */
656 .local_name = "serverReference",
662 .local_name = "serverState",
666 /* showInAdvancedViewOnly */
668 .local_name = "showInAdvancedViewOnly",
674 .local_name = "subRefs",
680 .local_name = "systemFlags",
686 .local_name = "uASCompat",
692 .local_name = "uSNChanged",
698 .local_name = "uSNCreated",
704 .local_name = "unicodePwd",
708 /* userAccountControl */
710 .local_name = "userAccountControl",
716 .local_name = "whenChanged",
722 .local_name = "whenCreated",
731 /* the init function */
732 #ifdef HAVE_DLOPEN_DISABLED
733 struct ldb_module *init_module(struct ldb_context *ldb, const char *options[])
735 struct ldb_module *ldb_samba3sam_module_init(struct ldb_context *ldb, const char *options[])
738 return ldb_map_init(ldb, samba3_attributes, samba3_objectclasses, "samba3sam");