/* [<][>][^][v][top][bottom][index][help] */
DEFINITIONS
This source file includes following definitions.
- generate_primaryGroupID
- generate_sambaPrimaryGroupSID
- convert_uid_samaccount
- lookup_homedir
- lookup_gid
- lookup_uid
- encode_sid
- decode_sid
- bin2hex
- hex2bin
- samba3sam_init
1 /*
2 ldb database library - Samba3 SAM compatibility backend
3
4 Copyright (C) Jelmer Vernooij 2005
5 Copyright (C) Martin Kuehl <mkhl@samba.org> 2006
6 */
7
8 #include "includes.h"
9 #include "ldb_module.h"
10 #include "ldb/ldb_map/ldb_map.h"
11 #include "system/passwd.h"
12
13 #include "librpc/gen_ndr/ndr_security.h"
14 #include "librpc/gen_ndr/ndr_samr.h"
15 #include "librpc/ndr/libndr.h"
16 #include "libcli/security/security.h"
17 #include "libcli/security/proto.h"
18 #include "lib/samba3/samba3.h"
19
20 /*
21 * sambaSID -> member (dn!)
22 * sambaSIDList -> member (dn!)
23 * sambaDomainName -> name
24 * sambaTrustPassword
25 * sambaUnixIdPool
26 * sambaIdmapEntry
27 * sambaAccountPolicy
28 * sambaSidEntry
29 * sambaAcctFlags -> systemFlags ?
30 * sambaPasswordHistory -> ntPwdHistory*/
31
32 /* Not necessary:
33 * sambaConfig
34 * sambaShare
35 * sambaConfigOption
36 * sambaNextGroupRid
37 * sambaNextUserRid
38 * sambaAlgorithmicRidBase
39 */
40
41 /* Not in Samba4:
42 * sambaKickoffTime
43 * sambaPwdCanChange
44 * sambaPwdMustChange
45 * sambaHomePath
46 * sambaHomeDrive
47 * sambaLogonScript
48 * sambaProfilePath
49 * sambaUserWorkstations
50 * sambaMungedDial
51 * sambaLogonHours */
52
53 /* In Samba4 but not in Samba3:
54 */
55
56 /* From a sambaPrimaryGroupSID, generate a primaryGroupID (integer) attribute */
57 static struct ldb_message_element *generate_primaryGroupID(struct ldb_module *module, TALLOC_CTX *ctx, const char *local_attr, const struct ldb_message *remote)
/* [<][>][^][v][top][bottom][index][help] */
58 {
59 struct ldb_message_element *el;
60 const char *sid = ldb_msg_find_attr_as_string(remote, "sambaPrimaryGroupSID", NULL);
61 const char *p;
62
63 if (!sid)
64 return NULL;
65
66 p = strrchr(sid, '-');
67 if (!p)
68 return NULL;
69
70 el = talloc_zero(ctx, struct ldb_message_element);
71 el->name = talloc_strdup(ctx, "primaryGroupID");
72 el->num_values = 1;
73 el->values = talloc_array(ctx, struct ldb_val, 1);
74 el->values[0].data = (uint8_t *)talloc_strdup(el->values, p+1);
75 el->values[0].length = strlen((char *)el->values[0].data);
76
77 return el;
78 }
79
80 static void generate_sambaPrimaryGroupSID(struct ldb_module *module, const char *local_attr, const struct ldb_message *local, struct ldb_message *remote_mp, struct ldb_message *remote_fb)
/* [<][>][^][v][top][bottom][index][help] */
81 {
82 const struct ldb_val *sidval;
83 char *sidstring;
84 struct dom_sid *sid;
85 enum ndr_err_code ndr_err;
86
87 /* We need the domain, so we get it from the objectSid that we hope is here... */
88 sidval = ldb_msg_find_ldb_val(local, "objectSid");
89
90 if (!sidval)
91 return; /* Sorry, no SID today.. */
92
93 sid = talloc(remote_mp, struct dom_sid);
94 if (sid == NULL) {
95 return;
96 }
97
98 ndr_err = ndr_pull_struct_blob(sidval, sid, NULL, sid, (ndr_pull_flags_fn_t)ndr_pull_dom_sid);
99 if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
100 talloc_free(sid);
101 return;
102 }
103
104 if (!ldb_msg_find_ldb_val(local, "primaryGroupID"))
105 return; /* Sorry, no SID today.. */
106
107 sid->num_auths--;
108
109 sidstring = dom_sid_string(remote_mp, sid);
110 talloc_free(sid);
111 ldb_msg_add_fmt(remote_mp, "sambaPrimaryGroupSID", "%s-%d", sidstring, ldb_msg_find_attr_as_uint(local, "primaryGroupID", 0));
112 talloc_free(sidstring);
113 }
114
115 /* Just copy the old value. */
116 static struct ldb_val convert_uid_samaccount(struct ldb_module *module, TALLOC_CTX *ctx, const struct ldb_val *val)
/* [<][>][^][v][top][bottom][index][help] */
117 {
118 struct ldb_val out = data_blob(NULL, 0);
119 out = ldb_val_dup(ctx, val);
120
121 return out;
122 }
123
124 static struct ldb_val lookup_homedir(struct ldb_module *module, TALLOC_CTX *ctx, const struct ldb_val *val)
/* [<][>][^][v][top][bottom][index][help] */
125 {
126 struct ldb_context *ldb;
127 struct passwd *pwd;
128 struct ldb_val retval;
129
130 ldb = ldb_module_get_ctx(module);
131
132 pwd = getpwnam((char *)val->data);
133
134 if (!pwd) {
135 ldb_debug(ldb, LDB_DEBUG_WARNING, "Unable to lookup '%s' in passwd", (char *)val->data);
136 return *talloc_zero(ctx, struct ldb_val);
137 }
138
139 retval.data = (uint8_t *)talloc_strdup(ctx, pwd->pw_dir);
140 retval.length = strlen((char *)retval.data);
141
142 return retval;
143 }
144
145 static struct ldb_val lookup_gid(struct ldb_module *module, TALLOC_CTX *ctx, const struct ldb_val *val)
/* [<][>][^][v][top][bottom][index][help] */
146 {
147 struct passwd *pwd;
148 struct ldb_val retval;
149
150 pwd = getpwnam((char *)val->data);
151
152 if (!pwd) {
153 return *talloc_zero(ctx, struct ldb_val);
154 }
155
156 retval.data = (uint8_t *)talloc_asprintf(ctx, "%ld", (unsigned long)pwd->pw_gid);
157 retval.length = strlen((char *)retval.data);
158
159 return retval;
160 }
161
162 static struct ldb_val lookup_uid(struct ldb_module *module, TALLOC_CTX *ctx, const struct ldb_val *val)
/* [<][>][^][v][top][bottom][index][help] */
163 {
164 struct passwd *pwd;
165 struct ldb_val retval;
166
167 pwd = getpwnam((char *)val->data);
168
169 if (!pwd) {
170 return *talloc_zero(ctx, struct ldb_val);
171 }
172
173 retval.data = (uint8_t *)talloc_asprintf(ctx, "%ld", (unsigned long)pwd->pw_uid);
174 retval.length = strlen((char *)retval.data);
175
176 return retval;
177 }
178
179 /* Encode a sambaSID to an objectSid. */
180 static struct ldb_val encode_sid(struct ldb_module *module, TALLOC_CTX *ctx, const struct ldb_val *val)
/* [<][>][^][v][top][bottom][index][help] */
181 {
182 struct ldb_val out = data_blob(NULL, 0);
183 struct dom_sid *sid;
184 enum ndr_err_code ndr_err;
185
186 sid = dom_sid_parse_talloc(ctx, (char *)val->data);
187 if (sid == NULL) {
188 return out;
189 }
190
191 ndr_err = ndr_push_struct_blob(&out, ctx,
192 NULL,
193 sid, (ndr_push_flags_fn_t)ndr_push_dom_sid);
194 talloc_free(sid);
195 if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
196 return out;
197 }
198
199 return out;
200 }
201
202 /* Decode an objectSid to a sambaSID. */
203 static struct ldb_val decode_sid(struct ldb_module *module, TALLOC_CTX *ctx, const struct ldb_val *val)
/* [<][>][^][v][top][bottom][index][help] */
204 {
205 struct ldb_val out = data_blob(NULL, 0);
206 struct dom_sid *sid;
207 enum ndr_err_code ndr_err;
208
209 sid = talloc(ctx, struct dom_sid);
210 if (sid == NULL) {
211 return out;
212 }
213
214 ndr_err = ndr_pull_struct_blob(val, sid, NULL, sid,
215 (ndr_pull_flags_fn_t)ndr_pull_dom_sid);
216 if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
217 goto done;
218 }
219
220 out.data = (uint8_t *)dom_sid_string(ctx, sid);
221 if (out.data == NULL) {
222 goto done;
223 }
224 out.length = strlen((const char *)out.data);
225
226 done:
227 talloc_free(sid);
228 return out;
229 }
230
231 /* Convert 16 bytes to 32 hex digits. */
232 static struct ldb_val bin2hex(struct ldb_module *module, TALLOC_CTX *ctx, const struct ldb_val *val)
/* [<][>][^][v][top][bottom][index][help] */
233 {
234 struct ldb_val out;
235 struct samr_Password pwd;
236 if (val->length != sizeof(pwd.hash)) {
237 return data_blob(NULL, 0);
238 }
239 memcpy(pwd.hash, val->data, sizeof(pwd.hash));
240 out = data_blob_string_const(smbpasswd_sethexpwd(ctx, &pwd, 0));
241 if (!out.data) {
242 return data_blob(NULL, 0);
243 }
244 return out;
245 }
246
247 /* Convert 32 hex digits to 16 bytes. */
248 static struct ldb_val hex2bin(struct ldb_module *module, TALLOC_CTX *ctx, const struct ldb_val *val)
/* [<][>][^][v][top][bottom][index][help] */
249 {
250 struct ldb_val out;
251 struct samr_Password *pwd;
252 pwd = smbpasswd_gethexpwd(ctx, (const char *)val->data);
253 if (!pwd) {
254 return data_blob(NULL, 0);
255 }
256 out = data_blob_talloc(ctx, pwd->hash, sizeof(pwd->hash));
257 return out;
258 }
259
260 const struct ldb_map_objectclass samba3_objectclasses[] = {
261 {
262 .local_name = "user",
263 .remote_name = "posixAccount",
264 .base_classes = { "top", NULL },
265 .musts = { "cn", "uid", "uidNumber", "gidNumber", "homeDirectory", NULL },
266 .mays = { "userPassword", "loginShell", "gecos", "description", NULL },
267 },
268 {
269 .local_name = "group",
270 .remote_name = "posixGroup",
271 .base_classes = { "top", NULL },
272 .musts = { "cn", "gidNumber", NULL },
273 .mays = { "userPassword", "memberUid", "description", NULL },
274 },
275 {
276 .local_name = "group",
277 .remote_name = "sambaGroupMapping",
278 .base_classes = { "top", "posixGroup", NULL },
279 .musts = { "gidNumber", "sambaSID", "sambaGroupType", NULL },
280 .mays = { "displayName", "description", "sambaSIDList", NULL },
281 },
282 {
283 .local_name = "user",
284 .remote_name = "sambaSAMAccount",
285 .base_classes = { "top", "posixAccount", NULL },
286 .musts = { "uid", "sambaSID", NULL },
287 .mays = { "cn", "sambaLMPassword", "sambaNTPassword",
288 "sambaPwdLastSet", "sambaLogonTime", "sambaLogoffTime",
289 "sambaKickoffTime", "sambaPwdCanChange", "sambaPwdMustChange",
290 "sambaAcctFlags", "displayName", "sambaHomePath", "sambaHomeDrive",
291 "sambaLogonScript", "sambaProfilePath", "description", "sambaUserWorkstations",
292 "sambaPrimaryGroupSID", "sambaDomainName", "sambaMungedDial",
293 "sambaBadPasswordCount", "sambaBadPasswordTime",
294 "sambaPasswordHistory", "sambaLogonHours", NULL }
295
296 },
297 {
298 .local_name = "domain",
299 .remote_name = "sambaDomain",
300 .base_classes = { "top", NULL },
301 .musts = { "sambaDomainName", "sambaSID", NULL },
302 .mays = { "sambaNextRid", "sambaNextGroupRid", "sambaNextUserRid", "sambaAlgorithmicRidBase", NULL },
303 },
304 { NULL, NULL }
305 };
306
307 const struct ldb_map_attribute samba3_attributes[] =
308 {
309 /* sambaNextRid -> nextRid */
310 {
311 .local_name = "nextRid",
312 .type = MAP_RENAME,
313 .u = {
314 .rename = {
315 .remote_name = "sambaNextRid",
316 },
317 },
318 },
319
320 /* sambaBadPasswordTime -> badPasswordtime*/
321 {
322 .local_name = "badPasswordTime",
323 .type = MAP_RENAME,
324 .u = {
325 .rename = {
326 .remote_name = "sambaBadPasswordTime",
327 },
328 },
329 },
330
331 /* sambaLMPassword -> lmPwdHash*/
332 {
333 .local_name = "dBCSPwd",
334 .type = MAP_CONVERT,
335 .u = {
336 .convert = {
337 .remote_name = "sambaLMPassword",
338 .convert_local = bin2hex,
339 .convert_remote = hex2bin,
340 },
341 },
342 },
343
344 /* sambaGroupType -> groupType */
345 {
346 .local_name = "groupType",
347 .type = MAP_RENAME,
348 .u = {
349 .rename = {
350 .remote_name = "sambaGroupType",
351 },
352 },
353 },
354
355 /* sambaNTPassword -> ntPwdHash*/
356 {
357 .local_name = "ntpwdhash",
358 .type = MAP_CONVERT,
359 .u = {
360 .convert = {
361 .remote_name = "sambaNTPassword",
362 .convert_local = bin2hex,
363 .convert_remote = hex2bin,
364 },
365 },
366 },
367
368 /* sambaPrimaryGroupSID -> primaryGroupID */
369 {
370 .local_name = "primaryGroupID",
371 .type = MAP_GENERATE,
372 .u = {
373 .generate = {
374 .remote_names = { "sambaPrimaryGroupSID", NULL },
375 .generate_local = generate_primaryGroupID,
376 .generate_remote = generate_sambaPrimaryGroupSID,
377 },
378 },
379 },
380
381 /* sambaBadPasswordCount -> badPwdCount */
382 {
383 .local_name = "badPwdCount",
384 .type = MAP_RENAME,
385 .u = {
386 .rename = {
387 .remote_name = "sambaBadPasswordCount",
388 },
389 },
390 },
391
392 /* sambaLogonTime -> lastLogon*/
393 {
394 .local_name = "lastLogon",
395 .type = MAP_RENAME,
396 .u = {
397 .rename = {
398 .remote_name = "sambaLogonTime",
399 },
400 },
401 },
402
403 /* sambaLogoffTime -> lastLogoff*/
404 {
405 .local_name = "lastLogoff",
406 .type = MAP_RENAME,
407 .u = {
408 .rename = {
409 .remote_name = "sambaLogoffTime",
410 },
411 },
412 },
413
414 /* uid -> unixName */
415 {
416 .local_name = "unixName",
417 .type = MAP_RENAME,
418 .u = {
419 .rename = {
420 .remote_name = "uid",
421 },
422 },
423 },
424
425 /* displayName -> name */
426 {
427 .local_name = "name",
428 .type = MAP_RENAME,
429 .u = {
430 .rename = {
431 .remote_name = "displayName",
432 },
433 },
434 },
435
436 /* cn */
437 {
438 .local_name = "cn",
439 .type = MAP_KEEP,
440 },
441
442 /* sAMAccountName -> cn */
443 {
444 .local_name = "sAMAccountName",
445 .type = MAP_CONVERT,
446 .u = {
447 .convert = {
448 .remote_name = "uid",
449 .convert_remote = convert_uid_samaccount,
450 },
451 },
452 },
453
454 /* objectCategory */
455 {
456 .local_name = "objectCategory",
457 .type = MAP_IGNORE,
458 },
459
460 /* objectGUID */
461 {
462 .local_name = "objectGUID",
463 .type = MAP_IGNORE,
464 },
465
466 /* objectVersion */
467 {
468 .local_name = "objectVersion",
469 .type = MAP_IGNORE,
470 },
471
472 /* codePage */
473 {
474 .local_name = "codePage",
475 .type = MAP_IGNORE,
476 },
477
478 /* dNSHostName */
479 {
480 .local_name = "dNSHostName",
481 .type = MAP_IGNORE,
482 },
483
484
485 /* dnsDomain */
486 {
487 .local_name = "dnsDomain",
488 .type = MAP_IGNORE,
489 },
490
491 /* dnsRoot */
492 {
493 .local_name = "dnsRoot",
494 .type = MAP_IGNORE,
495 },
496
497 /* countryCode */
498 {
499 .local_name = "countryCode",
500 .type = MAP_IGNORE,
501 },
502
503 /* nTMixedDomain */
504 {
505 .local_name = "nTMixedDomain",
506 .type = MAP_IGNORE,
507 },
508
509 /* operatingSystem */
510 {
511 .local_name = "operatingSystem",
512 .type = MAP_IGNORE,
513 },
514
515 /* operatingSystemVersion */
516 {
517 .local_name = "operatingSystemVersion",
518 .type = MAP_IGNORE,
519 },
520
521
522 /* servicePrincipalName */
523 {
524 .local_name = "servicePrincipalName",
525 .type = MAP_IGNORE,
526 },
527
528 /* msDS-Behavior-Version */
529 {
530 .local_name = "msDS-Behavior-Version",
531 .type = MAP_IGNORE,
532 },
533
534 /* msDS-KeyVersionNumber */
535 {
536 .local_name = "msDS-KeyVersionNumber",
537 .type = MAP_IGNORE,
538 },
539
540 /* msDs-masteredBy */
541 {
542 .local_name = "msDs-masteredBy",
543 .type = MAP_IGNORE,
544 },
545
546 /* ou */
547 {
548 .local_name = "ou",
549 .type = MAP_KEEP,
550 },
551
552 /* dc */
553 {
554 .local_name = "dc",
555 .type = MAP_KEEP,
556 },
557
558 /* description */
559 {
560 .local_name = "description",
561 .type = MAP_KEEP,
562 },
563
564 /* sambaSID -> objectSid*/
565 {
566 .local_name = "objectSid",
567 .type = MAP_CONVERT,
568 .u = {
569 .convert = {
570 .remote_name = "sambaSID",
571 .convert_local = decode_sid,
572 .convert_remote = encode_sid,
573 },
574 },
575 },
576
577 /* sambaPwdLastSet -> pwdLastSet */
578 {
579 .local_name = "pwdLastSet",
580 .type = MAP_RENAME,
581 .u = {
582 .rename = {
583 .remote_name = "sambaPwdLastSet",
584 },
585 },
586 },
587
588 /* accountExpires */
589 {
590 .local_name = "accountExpires",
591 .type = MAP_IGNORE,
592 },
593
594 /* adminCount */
595 {
596 .local_name = "adminCount",
597 .type = MAP_IGNORE,
598 },
599
600 /* canonicalName */
601 {
602 .local_name = "canonicalName",
603 .type = MAP_IGNORE,
604 },
605
606 /* createTimestamp */
607 {
608 .local_name = "createTimestamp",
609 .type = MAP_IGNORE,
610 },
611
612 /* creationTime */
613 {
614 .local_name = "creationTime",
615 .type = MAP_IGNORE,
616 },
617
618 /* dMDLocation */
619 {
620 .local_name = "dMDLocation",
621 .type = MAP_IGNORE,
622 },
623
624 /* fSMORoleOwner */
625 {
626 .local_name = "fSMORoleOwner",
627 .type = MAP_IGNORE,
628 },
629
630 /* forceLogoff */
631 {
632 .local_name = "forceLogoff",
633 .type = MAP_IGNORE,
634 },
635
636 /* instanceType */
637 {
638 .local_name = "instanceType",
639 .type = MAP_IGNORE,
640 },
641
642 /* invocationId */
643 {
644 .local_name = "invocationId",
645 .type = MAP_IGNORE,
646 },
647
648 /* isCriticalSystemObject */
649 {
650 .local_name = "isCriticalSystemObject",
651 .type = MAP_IGNORE,
652 },
653
654 /* localPolicyFlags */
655 {
656 .local_name = "localPolicyFlags",
657 .type = MAP_IGNORE,
658 },
659
660 /* lockOutObservationWindow */
661 {
662 .local_name = "lockOutObservationWindow",
663 .type = MAP_IGNORE,
664 },
665
666 /* lockoutDuration */
667 {
668 .local_name = "lockoutDuration",
669 .type = MAP_IGNORE,
670 },
671
672 /* lockoutThreshold */
673 {
674 .local_name = "lockoutThreshold",
675 .type = MAP_IGNORE,
676 },
677
678 /* logonCount */
679 {
680 .local_name = "logonCount",
681 .type = MAP_IGNORE,
682 },
683
684 /* masteredBy */
685 {
686 .local_name = "masteredBy",
687 .type = MAP_IGNORE,
688 },
689
690 /* maxPwdAge */
691 {
692 .local_name = "maxPwdAge",
693 .type = MAP_IGNORE,
694 },
695
696 /* member */
697 {
698 .local_name = "member",
699 .type = MAP_IGNORE,
700 },
701
702 /* memberOf */
703 {
704 .local_name = "memberOf",
705 .type = MAP_IGNORE,
706 },
707
708 /* minPwdAge */
709 {
710 .local_name = "minPwdAge",
711 .type = MAP_IGNORE,
712 },
713
714 /* minPwdLength */
715 {
716 .local_name = "minPwdLength",
717 .type = MAP_IGNORE,
718 },
719
720 /* modifiedCount */
721 {
722 .local_name = "modifiedCount",
723 .type = MAP_IGNORE,
724 },
725
726 /* modifiedCountAtLastProm */
727 {
728 .local_name = "modifiedCountAtLastProm",
729 .type = MAP_IGNORE,
730 },
731
732 /* modifyTimestamp */
733 {
734 .local_name = "modifyTimestamp",
735 .type = MAP_IGNORE,
736 },
737
738 /* nCName */
739 {
740 .local_name = "nCName",
741 .type = MAP_IGNORE,
742 },
743
744 /* nETBIOSName */
745 {
746 .local_name = "nETBIOSName",
747 .type = MAP_IGNORE,
748 },
749
750 /* oEMInformation */
751 {
752 .local_name = "oEMInformation",
753 .type = MAP_IGNORE,
754 },
755
756 /* privilege */
757 {
758 .local_name = "privilege",
759 .type = MAP_IGNORE,
760 },
761
762 /* pwdHistoryLength */
763 {
764 .local_name = "pwdHistoryLength",
765 .type = MAP_IGNORE,
766 },
767
768 /* pwdProperties */
769 {
770 .local_name = "pwdProperties",
771 .type = MAP_IGNORE,
772 },
773
774 /* rIDAvailablePool */
775 {
776 .local_name = "rIDAvailablePool",
777 .type = MAP_IGNORE,
778 },
779
780 /* revision */
781 {
782 .local_name = "revision",
783 .type = MAP_IGNORE,
784 },
785
786 /* ridManagerReference */
787 {
788 .local_name = "ridManagerReference",
789 .type = MAP_IGNORE,
790 },
791
792 /* sAMAccountType */
793 {
794 .local_name = "sAMAccountType",
795 .type = MAP_IGNORE,
796 },
797
798 /* sPNMappings */
799 {
800 .local_name = "sPNMappings",
801 .type = MAP_IGNORE,
802 },
803
804 /* serverReference */
805 {
806 .local_name = "serverReference",
807 .type = MAP_IGNORE,
808 },
809
810 /* serverState */
811 {
812 .local_name = "serverState",
813 .type = MAP_IGNORE,
814 },
815
816 /* showInAdvancedViewOnly */
817 {
818 .local_name = "showInAdvancedViewOnly",
819 .type = MAP_IGNORE,
820 },
821
822 /* subRefs */
823 {
824 .local_name = "subRefs",
825 .type = MAP_IGNORE,
826 },
827
828 /* systemFlags */
829 {
830 .local_name = "systemFlags",
831 .type = MAP_IGNORE,
832 },
833
834 /* uASCompat */
835 {
836 .local_name = "uASCompat",
837 .type = MAP_IGNORE,
838 },
839
840 /* uSNChanged */
841 {
842 .local_name = "uSNChanged",
843 .type = MAP_IGNORE,
844 },
845
846 /* uSNCreated */
847 {
848 .local_name = "uSNCreated",
849 .type = MAP_IGNORE,
850 },
851
852 /* userPassword */
853 {
854 .local_name = "userPassword",
855 .type = MAP_IGNORE,
856 },
857
858 /* userAccountControl */
859 {
860 .local_name = "userAccountControl",
861 .type = MAP_IGNORE,
862 },
863
864 /* whenChanged */
865 {
866 .local_name = "whenChanged",
867 .type = MAP_IGNORE,
868 },
869
870 /* whenCreated */
871 {
872 .local_name = "whenCreated",
873 .type = MAP_IGNORE,
874 },
875
876 /* uidNumber */
877 {
878 .local_name = "unixName",
879 .type = MAP_CONVERT,
880 .u = {
881 .convert = {
882 .remote_name = "uidNumber",
883 .convert_local = lookup_uid,
884 },
885 },
886 },
887
888 /* gidNumber. Perhaps make into generate so we can distinguish between
889 * groups and accounts? */
890 {
891 .local_name = "unixName",
892 .type = MAP_CONVERT,
893 .u = {
894 .convert = {
895 .remote_name = "gidNumber",
896 .convert_local = lookup_gid,
897 },
898 },
899 },
900
901 /* homeDirectory */
902 {
903 .local_name = "unixName",
904 .type = MAP_CONVERT,
905 .u = {
906 .convert = {
907 .remote_name = "homeDirectory",
908 .convert_local = lookup_homedir,
909 },
910 },
911 },
912 {
913 .local_name = NULL,
914 }
915 };
916
917 /* the context init function */
918 static int samba3sam_init(struct ldb_module *module)
/* [<][>][^][v][top][bottom][index][help] */
919 {
920 int ret;
921
922 ret = ldb_map_init(module, samba3_attributes, samba3_objectclasses, NULL, NULL, "samba3sam");
923 if (ret != LDB_SUCCESS)
924 return ret;
925
926 return ldb_next_init(module);
927 }
928
929 _PUBLIC_ const struct ldb_module_ops ldb_samba3sam_module_ops = {
930 LDB_MAP_OPS
931 .name = "samba3sam",
932 .init_context = samba3sam_init,
933 };