2 /* ldap.incr arguments example
4 * arguments when moira creates the account - ignored by ldap.incr since the
5 * account is unusable. users 0 11 #45198 45198 /bin/cmd cmd Last First Middle
6 * 0 950000001 2000 121049
8 * login, unix_uid, shell, winconsoleshell, last,
9 * first, middle, status, mitid, type, moiraid
11 * arguments for creating or updating a user account
12 * users 11 11 username 45206 /bin/cmd cmd Last First Middle 2 950000001 STAFF
13 * 121058 PathToHomeDir PathToProfileDir username 45206 /bin/cmd cmd Last
14 * First Middle 1 950000001 STAFF 121058 PathToHomeDir PathToProfileDir
15 * users 11 11 #45206 45206 /bin/cmd cmd Last First Middle 0 950000001 STAFF
16 * 121058 PathToHomeDir PathToProfileDir newuser 45206 /bin/cmd cmd Last
17 * First Middle 2 950000001 STAFF 121058 PathToHomeDir PathToProfileDir
19 * login, unix_uid, shell, winconsoleshell, last, first, middle, status,
20 * mitid, type, moiraid
22 * arguments for deactivating/deleting a user account
23 * users 11 11 username 45206 /bin/cmd cmd Last First Middle 1 950000001 STAFF
24 * 121058 PathToHomeDir PathToProfileDir username 45206 /bin/cmd cmd Last
25 * First Middle 3 950000001 STAFF 121058 PathToHomeDir PathToProfileDir
26 * users 11 11 username 45206 /bin/cmd cmd Last First Middle 2 950000001 STAFF
27 * 121058 PathToHomeDir PathToProfileDir username 45206 /bin/cmd cmd Last
28 * First Middle 3 950000001 STAFF 121058 PathToHomeDir PathToProfileDir
30 * login, unix_uid, shell, winconsoleshell, last, first, middle, status,
31 * mitid, type, moiraid
33 * arguments for reactivating a user account
34 * users 11 11 username 45206 /bin/cmd cmd Last First Middle 3 950000001 STAFF
35 * 121058 username 45206 /bin/cmd cmd Last First Middle 1 950000001 STAFF
37 * users 11 11 username 45206 /bin/cmd cmd Last First Middle 3 950000001 STAFF
38 * 121058 username 45206 /bin/cmd cmd Last First Middle 2 950000001 STAFF 12105
40 * login, unix_uid, shell, winconsoleshell, last, first, middle, status,
41 * mitid, type, moiraid
43 * arguments for changing user name
44 * users 11 11 oldusername 45206 /bin/cmd cmd Last First Middle 1 950000001
45 * STAFF 121058 PathToHomeDir PathToProfileDir newusername 45206 /bin/cmd cmd
46 * Last First Middle 1 950000001 STAFF 121058 PathToHomeDir PathToProfileDir
48 * login, unix_uid, shell, winconsoleshell, last, first, middle, status,
49 * mitid, type, moiraid
51 * arguments for expunging a user
52 * users 11 0 username 45198 /bin/cmd cmd Last First Middle 0 950000001 2000
55 * login, unix_uid, shell, winconsoleshell, last, first, middle, status,
56 * mitid, type, moiraid
58 * arguments for creating a "special" group/list
59 * list 0 11 listname 1 1 0 0 0 -1 NONE 0 description 92616
61 * listname, active, publicflg, hidden, maillist, grouplist, gid, acl_type,
62 * acl_id, description, moiraid
64 * arguments for creating a "mail" group/list
65 * list 0 11 listname 1 1 0 1 0 -1 NONE 0 description 92616
67 * listname, active, publicflg, hidden, maillist, grouplist, gid, acl_type,
68 * acl_id, description, moiraid
70 * arguments for creating a "group" group/list
71 * list 0 11 listname 1 1 0 0 1 -1 NONE 0 description 92616
73 * listname, active, publicflg, hidden, maillist, grouplist, gid, acl_type,
74 * acl_id, description, moiraid
76 * arguments for creating a "group/mail" group/list
77 * list 0 11 listname 1 1 0 1 1 -1 NONE 0 description 92616
79 * listname, active, publicflg, hidden, maillist, grouplist, gid, acl_type,
80 * acl_id, description, moiraid
82 * arguments to add a USER member to group/list
83 * imembers 0 12 listname USER userName 1 1 0 0 0 -1 1 92616 121047
85 * list_name, user_type, name, active, publicflg, hidden, maillist, grouplist,
86 * gid, userStatus, moiraListId, moiraUserId
88 * arguments to add a STRING or KERBEROS member to group/list
89 * imembers 0 10 listname STRING stringName 1 1 0 0 0 -1 92616
90 * imembers 0 10 listlistnameName KERBEROS kerberosName 1 1 0 0 0 -1 92616
92 * list_name, user_type, name, active, publicflg, hidden, maillist, grouplist,
95 * NOTE: group members of type LIST are ignored.
97 * arguments to remove a USER member to group/list
98 * imembers 12 0 listname USER userName 1 1 0 0 0 -1 1 92616 121047
100 * list_name, user_type, name, active, publicflg, hidden, maillist, grouplist,
101 * gid, userStatus, moiraListId, moiraUserId
103 * arguments to remove a STRING or KERBEROS member to group/list
104 * imembers 10 0 listname STRING stringName 1 1 0 0 0 -1 92616
105 * imembers 10 0 listname KERBEROS kerberosName 1 1 0 0 0 -1 92616
107 * list_name, user_type, name, active, publicflg, hidden, maillist, grouplist,
110 * NOTE: group members of type LIST are ignored.
112 * arguments for renaming a group/list
113 * list 11 11 oldlistname 1 1 0 0 0 -1 NONE 0 description 92616 newlistname 1
114 * 1 0 0 0 -1 description 0 92616
116 * name, active, publicflg, hidden, maillist, grouplist, gid, acl_type,
117 * acl_id, description, moiraListId
119 * arguments for deleting a group/list
120 * list 11 0 listname 1 1 0 0 0 -1 NONE 0 description 92616
122 * name, active, publicflg, hidden, maillist, grouplist, gid, acl_type,
123 * acl_id, description, moiraListId
125 * arguments for adding a file system
126 * filesys 0 12 username AFS ATHENA.MIT.EDU
127 * /afs/athena.mit.edu/user/n/e/username /mit/username w descripton username
128 * wheel 1 HOMEDIR 101727
130 * arguments for deleting a file system
131 * filesys 12 0 username AFS ATHENA.MIT.EDU
132 * /afs/athena.mit.edu/user/n/e/username /mit/username w descripton username
133 * wheel 1 HOMEDIR 101727
135 * arguments when moira creates a container (OU).
136 * containers 0 8 machines/test/bottom description location contact USER
139 * arguments when moira deletes a container (OU).
140 * containers 8 0 machines/test/bottom description location contact USER
141 * 105316 2222 groupname
143 * arguments when moira modifies a container information (OU).
144 * containers 8 8 machines/test/bottom description location contact USER
145 * 105316 2222 groupname machines/test/bottom description1 location contact
146 * USER 105316 2222 groupname
148 * arguments when moira adds a machine from an OU
149 * table name, beforec, afterc, machine_name, container_name, mach_id, cnt_id
150 * mcntmap 0 5 DAVIDT.MIT.EDU dttest/dttest1 76767 46 groupname
152 * arguments when moira removes a machine from an OU
153 * table name, beforec, afterc, machine_name, container_name, mach_id, cnt_id
154 * mcntmap 0 5 DAVIDT.MIT.EDU dttest/dttest1 76767 46 groupname
158 #include <mit-copyright.h>
161 #include <winsock2.h>
165 #include <lmaccess.h>
173 #include <moira_site.h>
174 #include <mrclient.h>
182 #define ECONNABORTED WSAECONNABORTED
185 #define ECONNREFUSED WSAECONNREFUSED
188 #define EHOSTUNREACH WSAEHOSTUNREACH
190 #define krb5_xfree free
192 #define sleep(A) Sleep(A * 1000);
196 #include <sys/types.h>
197 #include <netinet/in.h>
198 #include <arpa/nameser.h>
200 #include <sys/utsname.h>
203 #define CFG_PATH "/moira/ldap/"
204 #define WINADCFG "ldap.cfg"
205 #define strnicmp(A,B,C) strncasecmp(A,B,C)
206 #define UCHAR unsigned char
208 #define UF_SCRIPT 0x0001
209 #define UF_ACCOUNTDISABLE 0x0002
210 #define UF_HOMEDIR_REQUIRED 0x0008
211 #define UF_LOCKOUT 0x0010
212 #define UF_PASSWD_NOTREQD 0x0020
213 #define UF_PASSWD_CANT_CHANGE 0x0040
214 #define UF_DONT_EXPIRE_PASSWD 0x10000
216 #define UF_TEMP_DUPLICATE_ACCOUNT 0x0100
217 #define UF_NORMAL_ACCOUNT 0x0200
218 #define UF_INTERDOMAIN_TRUST_ACCOUNT 0x0800
219 #define UF_WORKSTATION_TRUST_ACCOUNT 0x1000
220 #define UF_SERVER_TRUST_ACCOUNT 0x2000
222 #define OWNER_SECURITY_INFORMATION (0x00000001L)
223 #define GROUP_SECURITY_INFORMATION (0x00000002L)
224 #define DACL_SECURITY_INFORMATION (0x00000004L)
225 #define SACL_SECURITY_INFORMATION (0x00000008L)
228 #define BYTE unsigned char
230 typedef unsigned int DWORD;
231 typedef unsigned long ULONG;
236 unsigned short Data2;
237 unsigned short Data3;
238 unsigned char Data4[8];
241 typedef struct _SID_IDENTIFIER_AUTHORITY {
243 } SID_IDENTIFIER_AUTHORITY, *PSID_IDENTIFIER_AUTHORITY;
245 typedef struct _SID {
247 BYTE SubAuthorityCount;
248 SID_IDENTIFIER_AUTHORITY IdentifierAuthority;
249 DWORD SubAuthority[512];
254 #define WINADCFG "ldap.cfg"
262 #define WINAFS "\\\\afs\\all\\"
264 #define ADS_GROUP_TYPE_GLOBAL_GROUP 0x00000002
265 #define ADS_GROUP_TYPE_DOMAIN_LOCAL_GROUP 0x00000004
266 #define ADS_GROUP_TYPE_LOCAL_GROUP 0x00000004
267 #define ADS_GROUP_TYPE_UNIVERSAL_GROUP 0x00000008
268 #define ADS_GROUP_TYPE_SECURITY_ENABLED 0x80000000
270 #define QUERY_VERSION -1
271 #define PRIMARY_REALM "ATHENA.MIT.EDU"
272 #define PRIMARY_DOMAIN "win.mit.edu"
273 #define PRODUCTION_PRINCIPAL "sms"
274 #define TEST_PRINCIPAL "smstest"
283 #define MEMBER_REMOVE 2
284 #define MEMBER_CHANGE_NAME 3
285 #define MEMBER_ACTIVATE 4
286 #define MEMBER_DEACTIVATE 5
287 #define MEMBER_CREATE 6
289 #define MOIRA_ALL 0x0
290 #define MOIRA_USERS 0x1
291 #define MOIRA_KERBEROS 0x2
292 #define MOIRA_STRINGS 0x4
293 #define MOIRA_LISTS 0x8
294 #define MOIRA_MACHINE 0x16
296 #define CHECK_GROUPS 1
297 #define CLEANUP_GROUPS 2
299 #define AD_NO_GROUPS_FOUND -1
300 #define AD_WRONG_GROUP_DN_FOUND -2
301 #define AD_MULTIPLE_GROUPS_FOUND -3
302 #define AD_INVALID_NAME -4
303 #define AD_LDAP_FAILURE -5
304 #define AD_INVALID_FILESYS -6
305 #define AD_NO_ATTRIBUTE_FOUND -7
306 #define AD_NO_OU_FOUND -8
307 #define AD_NO_USER_FOUND -9
309 /* container arguments */
310 #define CONTAINER_NAME 0
311 #define CONTAINER_DESC 1
312 #define CONTAINER_LOCATION 2
313 #define CONTAINER_CONTACT 3
314 #define CONTAINER_TYPE 4
315 #define CONTAINER_ID 5
316 #define CONTAINER_ROWID 6
317 #define CONTAINER_GROUP_NAME 7
319 /*mcntmap arguments*/
320 #define OU_MACHINE_NAME 0
321 #define OU_CONTAINER_NAME 1
322 #define OU_MACHINE_ID 2
323 #define OU_CONTAINER_ID 3
324 #define OU_CONTAINER_GROUP 4
326 typedef struct lk_entry {
336 struct lk_entry *next;
339 #define STOP_FILE "/moira/ldap/noldap"
340 #define file_exists(file) (access((file), F_OK) == 0)
342 #define N_SD_BER_BYTES 5
343 #define LDAP_BERVAL struct berval
344 #define MAX_SERVER_NAMES 32
346 #define HIDDEN_GROUP "HiddenGroup.g"
347 #define HIDDEN_GROUP_WITH_ADMIN "HiddenGroupWithAdmin.g"
348 #define NOT_HIDDEN_GROUP "NotHiddenGroup.g"
349 #define NOT_HIDDEN_GROUP_WITH_ADMIN "NotHiddenGroupWithAdmin.g"
351 #define ADDRESS_LIST_PREFIX "CN=MIT Directory,CN=All Address Lists,\
352 CN=Address Lists Container,CN=Massachusetts Institute of Technology,\
353 CN=Microsoft Exchange,CN=Services,CN=Configuration,"
355 #define GLOBAL_ADDRESS_LIST_PREFIX "CN=Default Global Address List,\
356 CN=All Global Address Lists,CN=Address Lists Container,\
357 CN=Massachusetts Institute of Technology,CN=Microsoft Exchange,CN=Services,\
360 #define EMAIL_ADDRESS_LIST_PREFIX "CN=Email Users,CN=All Users,\
361 CN=All Address Lists,CN=Address Lists Container,\
362 CN=Massachusetts Institute of Technology,CN=Microsoft Exchange,\
363 CN=Services,CN=Configuration,"
365 #define ALL_ADDRESS_LIST_PREFIX "CN=All Users,CN=All Address Lists,\
366 CN=Address Lists Container,CN=Massachusetts Institute of Technology,\
367 CN=Microsoft Exchange,CN=Services,CN=Configuration,"
369 #define X500_PREFIX "X500:/o=Massachusetts Institute of Technology/\
370 ou=Exchange Administrative Group (FYDIBOHF23SPDLT)/cn=Recipients"
372 #define ADD_ATTR(t, v, o) \
373 mods[n] = malloc(sizeof(LDAPMod)); \
374 mods[n]->mod_op = o; \
375 mods[n]->mod_type = t; \
376 mods[n++]->mod_values = v
378 #define DEL_ATTR(t, o) \
379 DelMods[i] = malloc(sizeof(LDAPMod)); \
380 DelMods[i]->mod_op = o; \
381 DelMods[i]->mod_type = t; \
382 DelMods[i++]->mod_values = NULL
384 #define DOMAIN_SUFFIX "MIT.EDU"
385 #define DOMAIN "DOMAIN:"
386 #define PRINCIPALNAME "PRINCIPAL:"
387 #define SERVER "SERVER:"
390 #define GROUP_SUFFIX "GROUP_SUFFIX:"
391 #define GROUP_TYPE "GROUP_TYPE:"
392 #define SET_GROUP_ACE "SET_GROUP_ACE:"
393 #define SET_PASSWORD "SET_PASSWORD:"
394 #define EXCHANGE "EXCHANGE:"
395 #define REALM "REALM:"
396 #define ACTIVE_DIRECTORY "ACTIVE_DIRECTORY:"
398 #define PROCESS_MACHINE_CONTAINER "PROCESS_MACHINE_CONTAINER:"
399 #define GROUP_POPULATE_MEMBERS "GROUP_POPULATE_MEMBERS:"
400 #define MAX_MEMBERS "MAX_MEMBERS:"
401 #define MAX_DOMAINS 10
402 char DomainNames[MAX_DOMAINS][128];
404 LK_ENTRY *member_base = NULL;
406 char PrincipalName[128];
407 static char tbl_buf[1024];
408 char kerberos_ou[] = "OU=kerberos,OU=moira";
409 char contact_ou[] = "OU=strings,OU=moira";
410 char user_ou[] = "OU=users,OU=moira";
411 char group_ou_distribution[1024];
412 char group_ou_root[1024];
413 char group_ou_security[1024];
414 char group_ou_neither[1024];
415 char group_ou_both[1024];
416 char orphans_machines_ou[] = "OU=Machines,OU=Orphans";
417 char orphans_other_ou[] = "OU=Other,OU=Orphans";
418 char security_template_ou[] = "OU=security_templates";
420 char ldap_domain[256];
421 char ldap_realm[256];
423 char *ServerList[MAX_SERVER_NAMES];
424 char default_server[256];
425 static char tbl_buf[1024];
426 char group_suffix[256];
427 char exchange_acl[256];
428 int mr_connections = 0;
431 int UseGroupSuffix = 1;
432 int UseGroupUniversal = 0;
436 int ProcessMachineContainer = 1;
437 int ActiveDirectory = 1;
438 int UpdateDomainList;
440 int GroupPopulateDelete = 0;
441 int group_members = 0;
442 int max_group_members = 0;
444 extern int set_password(char *user, char *password, char *domain);
446 int ad_get_group(LDAP *ldap_handle, char *dn_path, char *group_name,
447 char *group_membership, char *MoiraId, char *attribute,
448 LK_ENTRY **linklist_base, int *linklist_count,
450 void AfsToWinAfs(char* path, char* winPath);
451 int ad_connect(LDAP **ldap_handle, char *ldap_domain, char *dn_path,
452 char *Win2kPassword, char *Win2kUser, char *default_server,
453 int connect_to_kdc, char **ServerList, char *ldap_realm,
455 void ad_kdc_disconnect();
456 int ad_server_connect(char *connectedServer, char *domain);
457 int attribute_update(LDAP *ldap_handle, char *distinguished_name,
458 char *attribute_value, char *attribute, char *user_name);
459 int BEREncodeSecurityBits(ULONG uBits, char *pBuffer);
460 int checkADname(LDAP *ldap_handle, char *dn_path, char *Name);
461 int check_winad(void);
462 int check_user(LDAP *ldap_handle, char *dn_path, char *UserName,
465 int container_adupdate(LDAP *ldap_handle, char *dn_path, char *dName,
466 char *distinguishedName, int count, char **av);
467 void container_check(LDAP *ldap_handle, char *dn_path, char *name);
468 int container_create(LDAP *ldap_handle, char *dn_path, int count, char **av);
469 int container_delete(LDAP *ldap_handle, char *dn_path, int count, char **av);
470 int container_get_distinguishedName(LDAP *ldap_handle, char *dn_path,
471 char *distinguishedName, int count,
473 void container_get_dn(char *src, char *dest);
474 void container_get_name(char *src, char *dest);
475 int container_move_objects(LDAP *ldap_handle, char *dn_path, char *dName);
476 int container_rename(LDAP *ldap_handle, char *dn_path, int beforec,
477 char **before, int afterc, char **after);
478 int container_update(LDAP *ldap_handle, char *dn_path, int beforec,
479 char **before, int afterc, char **after);
481 int GetAceInfo(int ac, char **av, void *ptr);
482 int get_group_membership(char *group_membership, char *group_ou,
483 int *security_flag, char **av);
484 int get_machine_ou(LDAP *ldap_handle, char *dn_path, char *member,
485 char *machine_ou, char *pPtr);
486 int Moira_container_group_create(char **after);
487 int Moira_container_group_delete(char **before);
488 int Moira_groupname_create(char *GroupName, char *ContainerName,
489 char *ContainerRowID);
490 int Moira_container_group_update(char **before, char **after);
491 int Moira_process_machine_container_group(char *MachineName, char* groupName,
493 int Moira_addGroupToParent(char *origContainerName, char *GroupName);
494 int Moira_getContainerGroup(int ac, char **av, void *ptr);
495 int Moira_getGroupName(char *origContainerName, char *GroupName,
497 int Moira_setContainerGroup(char *ContainerName, char *GroupName);
498 int ProcessAce(LDAP *ldap_handle, char *dn_path, char *group_name, char *Type,
499 int UpdateGroup, int *ProcessGroup, char *maillist,
501 int process_group(LDAP *ldap_handle, char *dn_path, char *MoiraId,
502 char *group_name, char *group_ou, char *group_membership,
503 int group_security_flag, int type, char *maillist,
505 int process_lists(int ac, char **av, void *ptr);
506 int ProcessGroupSecurity(LDAP *ldap_handle, char *dn_path,
507 char *TargetGroupName, int HiddenGroup,
508 char *AceType, char *AceName);
509 int ProcessMachineName(int ac, char **av, void *ptr);
510 int ReadConfigFile(char *DomainName);
511 int ReadDomainList();
512 void StringTrim(char *StringToTrim);
513 char *escape_string(char *s);
514 int save_query_info(int argc, char **argv, void *hint);
515 int save_fsgroup_info(int argc, char **argv, void *hint);
516 int user_create(int ac, char **av, void *ptr);
517 int user_change_status(LDAP *ldap_handle, char *dn_path,
518 char *user_name, char *MoiraId, int operation);
519 int user_delete(LDAP *ldap_handle, char *dn_path,
520 char *u_name, char *MoiraId);
521 int user_rename(LDAP *ldap_handle, char *dn_path, char *before_user_name,
523 int user_update(LDAP *ldap_handle, char *dn_path, char *user_name,
524 char *uid, char *MitId, char *MoiraId, int State,
525 char *WinHomeDir, char *WinProfileDir, char *first,
526 char *middle, char *last, char *shell, char *class);
527 void change_to_lower_case(char *ptr);
528 int contact_create(LDAP *ld, char *bind_path, char *user, char *group_ou);
529 int contact_remove_email(LDAP *ld, char *bind_path,
530 LK_ENTRY **linklist_entry, int linklist_current);
531 int group_create(int ac, char **av, void *ptr);
532 int group_delete(LDAP *ldap_handle, char *dn_path,
533 char *group_name, char *group_membership, char *MoiraId);
534 int group_rename(LDAP *ldap_handle, char *dn_path,
535 char *before_group_name, char *before_group_membership,
536 char *before_group_ou, int before_security_flag,
537 char *before_desc, char *after_group_name,
538 char *after_group_membership, char *after_group_ou,
539 int after_security_flag, char *after_desc,
540 char *MoiraId, char *filter, char *maillist, char *nfsgroup);
541 int machine_check(LDAP *ldap_handle, char *dn_path, char *machine_name);
542 int machine_GetMoiraContainer(int ac, char **av, void *ptr);
543 int machine_get_moira_container(LDAP *ldap_handle, char *dn_path,
544 char *machine_name, char *container_name);
545 int machine_move_to_ou(LDAP *ldap_handle, char *dn_path,
546 char *MoiraMachineName, char *DestinationOu);
547 int make_new_group(LDAP *ldap_handle, char *dn_path, char *MoiraId,
548 char *group_name, char *group_ou, char *group_membership,
549 int group_security_flag, int updateGroup, char *maillist,
551 int member_list_build(int ac, char **av, void *ptr);
552 int member_add(LDAP *ldap_handle, char *dn_path, char *group_name,
553 char *group_ou, char *group_membership,
554 char *user_name, char *pUserOu, char *MoiraId);
555 int member_remove(LDAP *ldap_handle, char *dn_path, char *group_name,
556 char *group_ou, char *group_membership, char *user_name,
557 char *pUserOu, char *MoiraId);
558 int contains_member(LDAP *ldap_handle, char *dn_path, char *group_name,
559 char *UserOu, char *member);
560 int populate_group(LDAP *ldap_handle, char *dn_path, char *group_name,
561 char *group_ou, char *group_membership,
562 int group_security_flag, char *MoiraId, int synchronize);
563 int SetHomeDirectory(LDAP *ldap_handle, char *user_name,
564 char *DistinguishedName,
565 char *WinHomeDir, char *WinProfileDir,
566 char **homedir_v, char **winProfile_v,
567 char **drives_v, LDAPMod **mods,
569 int sid_update(LDAP *ldap_handle, char *dn_path);
570 void SwitchSFU(LDAPMod **mods, int *UseSFU30, int n);
571 int check_string(char *s);
572 int check_container_name(char* s);
574 int mr_connect_cl(char *server, char *client, int version, int auth);
575 void do_container(LDAP *ldap_handle, char *dn_path, char *ldap_hostname,
576 char **before, int beforec, char **after, int afterc);
577 void do_filesys(LDAP *ldap_handle, char *dn_path, char *ldap_hostname,
578 char **before, int beforec, char **after, int afterc);
579 void do_list(LDAP *ldap_handle, char *dn_path, char *ldap_hostname,
580 char **before, int beforec, char **after, int afterc);
581 void do_user(LDAP *ldap_handle, char *dn_path, char *ldap_hostname,
582 char **before, int beforec, char **after, int afterc);
583 void do_member(LDAP *ldap_handle, char *dn_path, char *ldap_hostname,
584 char **before, int beforec, char **after, int afterc);
585 void do_mcntmap(LDAP *ldap_handle, char *dn_path, char *ldap_hostname,
586 char **before, int beforec, char **after, int afterc);
587 int linklist_create_entry(char *attribute, char *value,
588 LK_ENTRY **linklist_entry);
589 int linklist_build(LDAP *ldap_handle, char *dn_path, char *search_exp,
590 char **attr_array, LK_ENTRY **linklist_base,
591 int *linklist_count, unsigned long ScopeType);
592 void linklist_free(LK_ENTRY *linklist_base);
594 int retrieve_attributes(LDAP *ldap_handle, LDAPMessage *ldap_entry,
595 char *distinguished_name, LK_ENTRY **linklist_current);
596 int retrieve_entries(LDAP *ldap_handle, LDAPMessage *ldap_entry,
597 LK_ENTRY **linklist_base, int *linklist_count);
598 int retrieve_values(LDAP *ldap_handle, LDAPMessage *ldap_entry,
599 char *Attribute, char *distinguished_name,
600 LK_ENTRY **linklist_current);
602 int construct_newvalues(LK_ENTRY *linklist_base, int modvalue_count,
603 char *oldValue, char *newValue,
604 char ***modvalues, int type);
605 void free_values(char **modvalues);
607 int convert_domain_to_dn(char *domain, char **bind_path);
608 void get_distinguished_name(LDAP *ldap_handle, LDAPMessage *ldap_entry,
609 char *distinguished_name);
610 int moira_disconnect(void);
611 int moira_connect(void);
612 void print_to_screen(const char *fmt, ...);
613 int GetMachineName(char *MachineName);
614 int tickets_get_k5();
615 int destroy_cache(void);
618 int find_homeMDB(LDAP *ldap_handle, char *dn_path, char **homeMDB,
619 char **homeServerName);
621 int main(int argc, char **argv)
637 whoami = ((whoami = (char *)strrchr(argv[0], '/')) ? whoami+1 : argv[0]);
641 com_err(whoami, 0, "Unable to process %s", "argc < 4");
645 if (argc < (4 + atoi(argv[2]) + atoi(argv[3])))
647 com_err(whoami, 0, "Unable to process %s",
648 "argc < (4 + beforec + afterc)");
652 if (!strcmp(argv[1], "filesys"))
655 for (i = 1; i < argc; i++)
657 strcat(tbl_buf, argv[i]);
658 strcat(tbl_buf, " ");
661 com_err(whoami, 0, "%s", tbl_buf);
665 com_err(whoami, 0, "%s failed", "check_winad()");
669 initialize_sms_error_table();
670 initialize_krb_error_table();
672 UpdateDomainList = 0;
673 memset(DomainNames, '\0', sizeof(DomainNames[0]) * MAX_DOMAINS);
675 if (ReadDomainList())
677 com_err(whoami, 0, "%s failed", "ReadDomainList()");
681 for (i = 0; i < argc; i++)
684 for (k = 0; k < MAX_DOMAINS; k++)
686 if (strlen(DomainNames[k]) == 0)
688 for (i = 0; i < argc; i++)
690 if (orig_argv[i] != NULL)
692 orig_argv[i] = strdup(argv[i]);
695 memset(PrincipalName, '\0', sizeof(PrincipalName));
696 memset(ldap_domain, '\0', sizeof(ldap_domain));
697 memset(ServerList, '\0', sizeof(ServerList[0]) * MAX_SERVER_NAMES);
698 memset(default_server, '\0', sizeof(default_server));
699 memset(dn_path, '\0', sizeof(dn_path));
700 memset(group_suffix, '\0', sizeof(group_suffix));
701 memset(exchange_acl, '\0', sizeof(exchange_acl));
705 UseGroupUniversal = 0;
709 ProcessMachineContainer = 1;
712 sprintf(group_suffix, "%s", "_group");
713 sprintf(exchange_acl, "%s", "exchange-acl");
715 beforec = atoi(orig_argv[2]);
716 afterc = atoi(orig_argv[3]);
717 table = orig_argv[1];
718 before = &orig_argv[4];
719 after = &orig_argv[4 + beforec];
727 if (ReadConfigFile(DomainNames[k]))
732 sprintf(group_ou_distribution, "OU=mail,OU=lists,OU=moira");
733 sprintf(group_ou_root, "OU=lists,OU=moira");
734 sprintf(group_ou_security, "OU=group,OU=lists,OU=moira");
735 sprintf(group_ou_neither, "OU=special,OU=lists,OU=moira");
736 sprintf(group_ou_both, "OU=mail,OU=group,OU=lists,OU=moira");
740 sprintf(group_ou_distribution, "OU=lists,OU=moira");
741 sprintf(group_ou_root, "OU=lists,OU=moira");
742 sprintf(group_ou_security, "OU=lists,OU=moira");
743 sprintf(group_ou_neither, "OU=lists,OU=moira");
744 sprintf(group_ou_both, "OU=lists,OU=moira");
747 OldUseSFU30 = UseSFU30;
749 for (i = 0; i < 5; i++)
751 ldap_handle = (LDAP *)NULL;
752 if (!(rc = ad_connect(&ldap_handle, ldap_domain, dn_path, "", "",
753 default_server, SetPassword, ServerList,
754 ldap_realm, ldap_port)))
756 com_err(whoami, 0, "connected to domain %s", DomainNames[k]);
761 if ((rc) || (ldap_handle == NULL))
763 critical_alert(whoami, "incremental",
764 "ldap.incr cannot connect to any server in "
765 "domain %s", DomainNames[k]);
769 for (i = 0; i < (int)strlen(table); i++)
770 table[i] = tolower(table[i]);
772 if (!strcmp(table, "users"))
773 do_user(ldap_handle, dn_path, ldap_domain, before, beforec, after,
775 else if (!strcmp(table, "list"))
776 do_list(ldap_handle, dn_path, ldap_domain, before, beforec, after,
778 else if (!strcmp(table, "imembers"))
779 do_member(ldap_handle, dn_path, ldap_domain, before, beforec, after,
781 else if (!strcmp(table, "containers"))
782 do_container(ldap_handle, dn_path, ldap_domain, before, beforec, after,
784 else if (!strcmp(table, "mcntmap"))
785 do_mcntmap(ldap_handle, dn_path, ldap_domain, before, beforec, after,
791 for (i = 0; i < MAX_SERVER_NAMES; i++)
793 if (ServerList[i] != NULL)
796 ServerList[i] = NULL;
800 rc = ldap_unbind_s(ldap_handle);
806 void do_mcntmap(LDAP *ldap_handle, char *dn_path, char *ldap_hostname,
807 char **before, int beforec, char **after, int afterc)
809 char MoiraContainerName[128];
810 char ADContainerName[128];
811 char MachineName[1024];
812 char OriginalMachineName[1024];
815 char MoiraContainerGroup[64];
817 if (!ProcessMachineContainer)
819 com_err(whoami, 0, "Process machines and containers disabled, skipping");
824 memset(ADContainerName, '\0', sizeof(ADContainerName));
825 memset(MoiraContainerName, '\0', sizeof(MoiraContainerName));
827 if ((beforec == 0) && (afterc == 0))
830 if (rc = moira_connect())
832 critical_alert(whoami, "Ldap incremental",
833 "Error contacting Moira server : %s",
838 if ((beforec != 0) && (afterc == 0)) /*remove a machine*/
840 strcpy(OriginalMachineName, before[OU_MACHINE_NAME]);
841 strcpy(MachineName, before[OU_MACHINE_NAME]);
842 strcpy(MoiraContainerGroup, before[OU_CONTAINER_GROUP]);
844 com_err(whoami, 0, "removing machine %s from %s",
845 OriginalMachineName, before[OU_CONTAINER_NAME]);
847 else if ((beforec == 0) && (afterc != 0)) /*add a machine*/
849 strcpy(OriginalMachineName, after[OU_MACHINE_NAME]);
850 strcpy(MachineName, after[OU_MACHINE_NAME]);
851 strcpy(MoiraContainerGroup, after[OU_CONTAINER_GROUP]);
852 com_err(whoami, 0, "adding machine %s to container %s",
853 OriginalMachineName, after[OU_CONTAINER_NAME]);
861 rc = GetMachineName(MachineName);
863 if (strlen(MachineName) == 0)
866 com_err(whoami, 0, "Unable to find alais for machine %s in Moira",
867 OriginalMachineName);
871 Moira_process_machine_container_group(MachineName, MoiraContainerGroup,
874 if (machine_check(ldap_handle, dn_path, MachineName))
876 com_err(whoami, 0, "Unable to find machine %s (alias %s) in directory.",
877 OriginalMachineName, MachineName);
882 memset(MoiraContainerName, '\0', sizeof(MoiraContainerName));
883 machine_get_moira_container(ldap_handle, dn_path, MachineName,
886 if (strlen(MoiraContainerName) == 0)
888 com_err(whoami, 0, "Unable to fine machine %s (alias %s) container "
889 "in Moira - moving to orphans OU.",
890 OriginalMachineName, MachineName);
891 machine_move_to_ou(ldap_handle, dn_path, MachineName,
892 orphans_machines_ou);
897 container_get_dn(MoiraContainerName, ADContainerName);
899 if (MoiraContainerName[strlen(MoiraContainerName) - 1] != '/')
900 strcat(MoiraContainerName, "/");
902 container_check(ldap_handle, dn_path, MoiraContainerName);
903 machine_move_to_ou(ldap_handle, dn_path, MachineName, ADContainerName);
908 void do_container(LDAP *ldap_handle, char *dn_path, char *ldap_hostname,
909 char **before, int beforec, char **after, int afterc)
913 if (!ProcessMachineContainer)
915 com_err(whoami, 0, "Process machines and containers disabled, skipping");
919 if ((beforec == 0) && (afterc == 0))
922 if (rc = moira_connect())
924 critical_alert(whoami, "Ldap incremental", "Error contacting Moira server : %s",
929 if ((beforec != 0) && (afterc == 0)) /*delete a new container*/
931 com_err(whoami, 0, "deleting container %s", before[CONTAINER_NAME]);
932 container_delete(ldap_handle, dn_path, beforec, before);
933 Moira_container_group_delete(before);
938 if ((beforec == 0) && (afterc != 0)) /*create a container*/
940 com_err(whoami, 0, "creating container %s", after[CONTAINER_NAME]);
941 container_check(ldap_handle, dn_path, after[CONTAINER_NAME]);
942 container_create(ldap_handle, dn_path, afterc, after);
943 Moira_container_group_create(after);
948 if (strcasecmp(before[CONTAINER_NAME], after[CONTAINER_NAME]))
950 com_err(whoami, 0, "renaming container %s to %s",
951 before[CONTAINER_NAME], after[CONTAINER_NAME]);
952 container_rename(ldap_handle, dn_path, beforec, before, afterc, after);
953 Moira_container_group_update(before, after);
958 com_err(whoami, 0, "updating container %s information",
959 after[CONTAINER_NAME]);
960 container_update(ldap_handle, dn_path, beforec, before, afterc, after);
961 Moira_container_group_update(before, after);
966 #define L_LIST_DESC 9
968 #define L_LIST_NFSGROUP 11
970 void do_list(LDAP *ldap_handle, char *dn_path, char *ldap_hostname,
971 char **before, int beforec, char **after, int afterc)
976 char group_membership[6];
981 char before_list_id[32];
982 char before_group_membership[1];
983 int before_security_flag;
984 char before_group_ou[256];
985 LK_ENTRY *ptr = NULL;
987 if (beforec == 0 && afterc == 0)
990 memset(list_id, '\0', sizeof(list_id));
991 memset(before_list_id, '\0', sizeof(before_list_id));
992 memset(before_group_ou, '\0', sizeof(before_group_ou));
993 memset(before_group_membership, '\0', sizeof(before_group_membership));
994 memset(group_ou, '\0', sizeof(group_ou));
995 memset(group_membership, '\0', sizeof(group_membership));
1000 if (beforec < L_LIST_ID)
1002 if (beforec > L_LIST_DESC)
1004 strcpy(before_list_id, before[L_LIST_ID]);
1006 before_security_flag = 0;
1007 get_group_membership(before_group_membership, before_group_ou,
1008 &before_security_flag, before);
1013 if (afterc < L_LIST_ID)
1015 if (afterc > L_LIST_DESC)
1017 strcpy(list_id, after[L_LIST_ID]);
1020 get_group_membership(group_membership, group_ou, &security_flag, after);
1023 if ((beforec == 0) && (afterc == 0)) /*this case should never happen*/
1032 if ((rc = process_group(ldap_handle, dn_path, before_list_id,
1033 before[L_NAME], before_group_ou,
1034 before_group_membership,
1035 before_security_flag, CHECK_GROUPS,
1036 before[L_MAILLIST], before[L_LIST_NFSGROUP])))
1038 if (rc == AD_NO_GROUPS_FOUND)
1042 if ((rc == AD_WRONG_GROUP_DN_FOUND) ||
1043 (rc == AD_MULTIPLE_GROUPS_FOUND))
1045 rc = process_group(ldap_handle, dn_path, before_list_id,
1046 before[L_NAME], before_group_ou,
1047 before_group_membership,
1048 before_security_flag, CLEANUP_GROUPS,
1050 before[L_LIST_NFSGROUP]);
1052 if ((rc != AD_NO_GROUPS_FOUND) && (rc != 0))
1054 com_err(whoami, 0, "Unable to process list %s",
1058 if (rc == AD_NO_GROUPS_FOUND)
1064 if ((beforec != 0) && (afterc != 0))
1066 if (((strcmp(after[L_NAME], before[L_NAME])) ||
1067 ((!strcmp(after[L_NAME], before[L_NAME])) &&
1068 (strcmp(before_group_ou, group_ou)))) &&
1071 com_err(whoami, 0, "Changing list name from %s to %s",
1072 before[L_NAME], after[L_NAME]);
1074 if ((strlen(before_group_ou) == 0) ||
1075 (strlen(before_group_membership) == 0) ||
1076 (strlen(group_ou) == 0) || (strlen(group_membership) == 0))
1078 com_err(whoami, 0, "%s", "Unable to find the group OU's");
1082 memset(filter, '\0', sizeof(filter));
1084 if ((rc = group_rename(ldap_handle, dn_path,
1085 before[L_NAME], before_group_membership,
1086 before_group_ou, before_security_flag,
1087 before[L_LIST_DESC], after[L_NAME],
1088 group_membership, group_ou, security_flag,
1090 list_id, filter, after[L_MAILLIST],
1091 after[L_LIST_NFSGROUP])))
1093 if (rc != AD_NO_GROUPS_FOUND)
1096 "Unable to change list name from %s to %s",
1097 before[L_NAME], after[L_NAME]);
1110 if ((strlen(before_group_ou) == 0) ||
1111 (strlen(before_group_membership) == 0))
1114 "Unable to find the group OU for group %s", before[L_NAME]);
1118 com_err(whoami, 0, "Deleting group %s", before[L_NAME]);
1119 rc = group_delete(ldap_handle, dn_path, before[L_NAME],
1120 before_group_membership, before_list_id);
1128 com_err(whoami, 0, "Creating group %s", after[L_NAME]);
1130 if (rc = process_group(ldap_handle, dn_path, list_id, after[L_NAME],
1131 group_ou, group_membership,
1132 security_flag, CHECK_GROUPS,
1133 after[L_MAILLIST], after[L_LIST_NFSGROUP]))
1135 if (rc != AD_NO_GROUPS_FOUND)
1137 if ((rc == AD_WRONG_GROUP_DN_FOUND) ||
1138 (rc == AD_MULTIPLE_GROUPS_FOUND))
1140 rc = process_group(ldap_handle, dn_path, list_id,
1142 group_ou, group_membership,
1143 security_flag, CLEANUP_GROUPS,
1145 after[L_LIST_NFSGROUP]);
1151 "Unable to create list %s", after[L_NAME]);
1158 com_err(whoami, 0, "Updating group %s information", after[L_NAME]);
1160 if (rc = moira_connect())
1162 critical_alert(whoami, "Ldap incremental",
1163 "Error contacting Moira server : %s",
1170 if (ProcessAce(ldap_handle, dn_path, after[L_NAME], "LIST", 0,
1171 &ProcessGroup, after[L_MAILLIST], after[L_LIST_NFSGROUP]))
1176 if (ProcessAce(ldap_handle, dn_path, after[L_NAME], "LIST", 1,
1177 &ProcessGroup, after[L_MAILLIST],
1178 after[L_LIST_NFSGROUP]))
1182 if (make_new_group(ldap_handle, dn_path, list_id, after[L_NAME],
1183 group_ou, group_membership, security_flag,
1184 updateGroup, after[L_MAILLIST],
1185 after[L_LIST_NFSGROUP]))
1191 if (atoi(after[L_ACTIVE]))
1193 populate_group(ldap_handle, dn_path, after[L_NAME], group_ou,
1194 group_membership, security_flag, list_id, 1);
1202 #define LM_EXTRA_ACTIVE (LM_END)
1203 #define LM_EXTRA_PUBLIC (LM_END+1)
1204 #define LM_EXTRA_HIDDEN (LM_END+2)
1205 #define LM_EXTRA_MAILLIST (LM_END+3)
1206 #define LM_EXTRA_GROUP (LM_END+4)
1207 #define LM_EXTRA_GID (LM_END+5)
1208 #define LM_EXTRA_NFSGROUP (LM_END+6)
1209 #define LMN_LIST_ID (LM_END+7)
1210 #define LM_LIST_ID (LM_END+8)
1211 #define LM_USER_ID (LM_END+9)
1212 #define LM_EXTRA_END (LM_END+10)
1214 void do_member(LDAP *ldap_handle, char *dn_path, char *ldap_hostname,
1215 char **before, int beforec, char **after, int afterc)
1217 LK_ENTRY *group_base;
1220 char *attr_array[3];
1221 char group_name[128];
1222 char user_name[128];
1223 char user_type[128];
1224 char moira_list_id[32];
1225 char moira_user_id[32];
1226 char group_membership[1];
1228 char machine_ou[256];
1236 char NewMachineName[1024];
1240 char *save_argv[U_END];
1244 memset(moira_list_id, '\0', sizeof(moira_list_id));
1245 memset(moira_user_id, '\0', sizeof(moira_user_id));
1249 if (afterc < LM_EXTRA_GID)
1252 if (!atoi(after[LM_EXTRA_ACTIVE]))
1255 "Unable to add %s to group %s : group not active",
1256 after[2], after[0]);
1262 if (!strcasecmp(ptr[LM_TYPE], "LIST"))
1265 strcpy(user_name, after[LM_MEMBER]);
1266 strcpy(group_name, after[LM_LIST]);
1267 strcpy(user_type, after[LM_TYPE]);
1269 if (!strcasecmp(ptr[LM_TYPE], "MACHINE"))
1271 if (afterc > LM_EXTRA_GROUP)
1273 strcpy(moira_list_id, after[LMN_LIST_ID]);
1274 strcpy(moira_user_id, after[LM_LIST_ID]);
1277 else if (!strcasecmp(ptr[LM_TYPE], "USER"))
1279 if (afterc > LMN_LIST_ID)
1281 strcpy(moira_list_id, after[LM_LIST_ID]);
1282 strcpy(moira_user_id, after[LM_USER_ID]);
1287 if (afterc > LM_EXTRA_GID)
1288 strcpy(moira_list_id, after[LMN_LIST_ID]);
1293 if (beforec < LM_EXTRA_GID)
1295 if (!atoi(before[LM_EXTRA_ACTIVE]))
1298 "Unable to remove %s from group %s : group not active",
1299 before[2], before[0]);
1305 if (!strcasecmp(ptr[LM_TYPE], "LIST"))
1308 strcpy(user_name, before[LM_MEMBER]);
1309 strcpy(group_name, before[LM_LIST]);
1310 strcpy(user_type, before[LM_TYPE]);
1312 if (!strcasecmp(ptr[LM_TYPE], "MACHINE"))
1314 if (beforec > LM_EXTRA_GROUP)
1316 strcpy(moira_list_id, before[LMN_LIST_ID]);
1317 strcpy(moira_user_id, before[LM_LIST_ID]);
1320 else if (!strcasecmp(ptr[LM_TYPE], "USER"))
1322 if (beforec > LMN_LIST_ID)
1324 strcpy(moira_list_id, before[LM_LIST_ID]);
1325 strcpy(moira_user_id, before[LM_USER_ID]);
1330 if (beforec > LM_EXTRA_GID)
1331 strcpy(moira_list_id, before[LMN_LIST_ID]);
1338 "Unable to process group : beforec = %d, afterc = %d",
1343 args[L_NAME] = ptr[LM_LIST];
1344 args[L_ACTIVE] = ptr[LM_EXTRA_ACTIVE];
1345 args[L_PUBLIC] = ptr[LM_EXTRA_PUBLIC];
1346 args[L_HIDDEN] = ptr[LM_EXTRA_HIDDEN];
1347 args[L_MAILLIST] = ptr[LM_EXTRA_MAILLIST];
1348 args[L_GROUP] = ptr[LM_EXTRA_GROUP];
1349 args[L_GID] = ptr[LM_EXTRA_GID];
1352 memset(group_ou, '\0', sizeof(group_ou));
1353 get_group_membership(group_membership, group_ou, &security_flag, args);
1355 if (strlen(group_ou) == 0)
1357 com_err(whoami, 0, "Unable to find the group OU for group %s",
1362 if (rc = process_group(ldap_handle, dn_path, moira_list_id, group_name,
1363 group_ou, group_membership, security_flag,
1364 CHECK_GROUPS, args[L_MAILLIST],
1365 args[L_LIST_NFSGROUP]))
1367 if (rc != AD_NO_GROUPS_FOUND)
1369 if (rc = process_group(ldap_handle, dn_path, moira_list_id,
1370 group_name, group_ou, group_membership,
1371 security_flag, CLEANUP_GROUPS,
1372 args[L_MAILLIST], args[L_LIST_NFSGROUP]))
1374 if (rc != AD_NO_GROUPS_FOUND)
1377 com_err(whoami, 0, "Unable to add %s to group %s - "
1378 "unable to process group", user_name, group_name);
1380 com_err(whoami, 0, "Unable to remove %s from group %s - "
1381 "unable to process group", user_name, group_name);
1388 if (rc == AD_NO_GROUPS_FOUND)
1390 if (rc = moira_connect())
1392 critical_alert(whoami, "Ldap incremental",
1393 "Error contacting Moira server : %s",
1398 com_err(whoami, 0, "creating group %s", group_name);
1401 if (ProcessAce(ldap_handle, dn_path, ptr[LM_LIST], "LIST", 0,
1402 &ProcessGroup, ptr[LM_EXTRA_MAILLIST],
1403 ptr[LM_EXTRA_NFSGROUP]))
1408 if (ProcessAce(ldap_handle, dn_path, ptr[LM_LIST], "LIST", 1,
1409 &ProcessGroup, ptr[LM_EXTRA_MAILLIST],
1410 ptr[LM_EXTRA_NFSGROUP]))
1414 if (make_new_group(ldap_handle, dn_path, moira_list_id, ptr[LM_LIST],
1415 group_ou, group_membership, security_flag, 0,
1416 ptr[LM_EXTRA_MAILLIST], ptr[LM_EXTRA_NFSGROUP]))
1422 if (atoi(ptr[LM_EXTRA_ACTIVE]))
1424 populate_group(ldap_handle, dn_path, ptr[LM_LIST], group_ou,
1425 group_membership, security_flag, moira_list_id, 1);
1435 com_err(whoami, 0, "removing user %s from list %s", user_name,
1439 if (!strcasecmp(ptr[LM_TYPE], "MACHINE"))
1441 if (!ProcessMachineContainer)
1443 com_err(whoami, 0, "Process machines and containers disabled, "
1448 memset(machine_ou, '\0', sizeof(machine_ou));
1449 memset(NewMachineName, '\0', sizeof(NewMachineName));
1450 if (get_machine_ou(ldap_handle, dn_path, ptr[LM_MEMBER],
1451 machine_ou, NewMachineName))
1453 if (ptr[LM_MEMBER] != NULL)
1454 free(ptr[LM_MEMBER]);
1455 ptr[LM_MEMBER] = strdup(NewMachineName);
1456 pUserOu = machine_ou;
1459 if (!strcasecmp(ptr[LM_TYPE], "STRING"))
1461 strcpy(member, ptr[LM_MEMBER]);
1465 if((s = strchr(member, '@')) == (char *) NULL)
1468 if(!strncasecmp(&member[strlen(member) - 6], ".LOCAL", 6))
1472 if (contact_create(ldap_handle, dn_path, ptr[LM_MEMBER],
1476 pUserOu = contact_ou;
1478 else if (!strcasecmp(ptr[LM_TYPE], "KERBEROS"))
1480 if (contact_create(ldap_handle, dn_path, ptr[LM_MEMBER],
1484 pUserOu = kerberos_ou;
1487 if (rc = moira_connect()) {
1488 critical_alert(whoami, "Ldap incremental",
1489 "Error contacting Moira server : %s",
1494 if (rc = populate_group(ldap_handle, dn_path, group_name,
1495 group_ou, group_membership,
1496 security_flag, moira_list_id, 0))
1497 com_err(whoami, 0, "Unable to remove %s from group %s", user_name,
1502 if (rc = member_remove(ldap_handle, dn_path, group_name,
1503 group_ou, group_membership,
1504 escape_string(ptr[LM_MEMBER]),
1505 pUserOu, moira_list_id))
1506 com_err(whoami, 0, "Unable to remove %s from group %s", user_name,
1512 com_err(whoami, 0, "Adding %s to list %s", user_name, group_name);
1515 if (!strcasecmp(ptr[LM_TYPE], "MACHINE"))
1517 memset(machine_ou, '\0', sizeof(machine_ou));
1518 memset(NewMachineName, '\0', sizeof(NewMachineName));
1520 if (get_machine_ou(ldap_handle, dn_path, ptr[LM_MEMBER], machine_ou,
1524 if (ptr[LM_MEMBER] != NULL)
1525 free(ptr[LM_MEMBER]);
1527 ptr[LM_MEMBER] = strdup(NewMachineName);
1528 pUserOu = machine_ou;
1530 else if (!strcasecmp(ptr[LM_TYPE], "STRING"))
1532 strcpy(member, ptr[LM_MEMBER]);
1536 if((s = strchr(member, '@')) == (char *) NULL)
1539 if(!strncasecmp(&member[strlen(member) - 6], ".LOCAL", 6))
1543 if (contact_create(ldap_handle, dn_path, ptr[LM_MEMBER],
1547 pUserOu = contact_ou;
1549 else if (!strcasecmp(ptr[LM_TYPE], "KERBEROS"))
1551 if (contact_create(ldap_handle, dn_path, ptr[LM_MEMBER],
1555 pUserOu = kerberos_ou;
1557 else if (!strcasecmp(ptr[LM_TYPE], "USER"))
1559 if ((rc = check_user(ldap_handle, dn_path, ptr[LM_MEMBER],
1560 moira_user_id)) == AD_NO_USER_FOUND)
1562 if (rc = moira_connect())
1564 critical_alert(whoami, "Ldap incremental",
1565 "Error connection to Moira : %s",
1570 com_err(whoami, 0, "creating user %s", ptr[LM_MEMBER]);
1571 av[0] = ptr[LM_MEMBER];
1572 call_args[0] = (char *)ldap_handle;
1573 call_args[1] = dn_path;
1574 call_args[2] = moira_user_id;
1575 call_args[3] = NULL;
1584 sprintf(filter, "(&(objectClass=group)(cn=%s))", ptr[LM_MEMBER]);
1585 attr_array[0] = "cn";
1586 attr_array[1] = NULL;
1587 if ((rc = linklist_build(ldap_handle, dn_path, filter,
1588 attr_array, &group_base, &group_count,
1589 LDAP_SCOPE_SUBTREE)) != 0)
1591 com_err(whoami, 0, "Unable to process user %s : %s",
1592 ptr[LM_MEMBER], ldap_err2string(rc));
1598 com_err(whoami, 0, "Object already exists with name %s",
1603 linklist_free(group_base);
1608 if (rc = mr_query("get_user_account_by_login", 1, av,
1609 save_query_info, save_argv))
1612 com_err(whoami, 0, "Unable to create user %s : %s",
1613 ptr[LM_MEMBER], error_message(rc));
1617 if (rc = user_create(U_END, save_argv, call_args))
1620 com_err(whoami, 0, "Unable to create user %s", ptr[LM_MEMBER]);
1627 com_err(whoami, 0, "Unable to create user %s", ptr[LM_MEMBER]);
1639 if (rc = moira_connect()) {
1640 critical_alert(whoami, "Ldap incremental",
1641 "Error contacting Moira server : %s",
1646 if (rc = populate_group(ldap_handle, dn_path, group_name,
1647 group_ou, group_membership, security_flag,
1649 com_err(whoami, 0, "Unable to add %s to group %s", user_name,
1654 if (rc = member_add(ldap_handle, dn_path, group_name,
1655 group_ou, group_membership,
1656 escape_string(ptr[LM_MEMBER]),
1657 pUserOu, moira_list_id))
1658 com_err(whoami, 0, "Unable to add %s to group %s", user_name, group_name);
1663 #define U_USER_ID 10
1664 #define U_HOMEDIR 11
1665 #define U_PROFILEDIR 12
1668 void do_user(LDAP *ldap_handle, char *dn_path, char *ldap_hostname,
1669 char **before, int beforec, char **after,
1672 LK_ENTRY *group_base;
1675 char *attr_array[3];
1678 char after_user_id[32];
1679 char before_user_id[32];
1681 char *save_argv[U_END];
1683 if ((beforec == 0) && (afterc == 0))
1686 memset(after_user_id, '\0', sizeof(after_user_id));
1687 memset(before_user_id, '\0', sizeof(before_user_id));
1689 if (beforec > U_USER_ID)
1690 strcpy(before_user_id, before[U_USER_ID]);
1692 if (afterc > U_USER_ID)
1693 strcpy(after_user_id, after[U_USER_ID]);
1695 if ((beforec == 0) && (afterc == 0)) /*this case should never happen */
1698 if ((beforec == 0) && (afterc != 0))
1700 /*this case only happens when the account*/
1701 /*account is first created but not usable*/
1703 com_err(whoami, 0, "Unable to process user %s because the user account "
1704 "is not yet usable", after[U_NAME]);
1708 /*this case only happens when the account is expunged */
1710 if ((beforec != 0) && (afterc == 0))
1712 if (atoi(before[U_STATE]) == 0)
1714 com_err(whoami, 0, "expunging user %s from directory",
1716 user_delete(ldap_handle, dn_path, before[U_NAME], before_user_id);
1720 com_err(whoami, 0, "Unable to process because user %s has been "
1721 "previously expungeded", before[U_NAME]);
1726 /*process anything that gets here*/
1728 if ((rc = check_user(ldap_handle, dn_path, before[U_NAME],
1729 before_user_id)) == AD_NO_USER_FOUND)
1731 if (!check_string(after[U_NAME]))
1734 if (rc = moira_connect())
1736 critical_alert(whoami, "Ldap incremental",
1737 "Error connection to Moira : %s",
1742 com_err(whoami, 0, "creating user %s", after[U_NAME]);
1744 av[0] = after[U_NAME];
1745 call_args[0] = (char *)ldap_handle;
1746 call_args[1] = dn_path;
1747 call_args[2] = after_user_id;
1748 call_args[3] = NULL;
1756 sprintf(filter, "(&(objectClass=group)(cn=%s))", after[U_NAME]);
1757 attr_array[0] = "cn";
1758 attr_array[1] = NULL;
1760 if ((rc = linklist_build(ldap_handle, dn_path, filter, attr_array,
1761 &group_base, &group_count,
1762 LDAP_SCOPE_SUBTREE)) != 0)
1764 com_err(whoami, 0, "Unable to process user %s : %s",
1765 after[U_NAME], ldap_err2string(rc));
1769 if (group_count >= 1)
1771 com_err(whoami, 0, "Object already exists with name %s",
1776 linklist_free(group_base);
1781 if (rc = mr_query("get_user_account_by_login", 1, av,
1782 save_query_info, save_argv))
1785 com_err(whoami, 0, "Unable to create user %s : %s",
1786 after[U_NAME], error_message(rc));
1790 if (rc = user_create(U_END, save_argv, call_args))
1792 com_err(whoami, 0, "Unable to create user %s : %s",
1793 after[U_NAME], error_message(rc));
1800 com_err(whoami, 0, "Unable to create user %s", after[U_NAME]);
1812 if (strcmp(before[U_NAME], after[U_NAME]))
1814 if ((check_string(before[U_NAME])) && (check_string(after[U_NAME])))
1816 com_err(whoami, 0, "changing user %s to %s",
1817 before[U_NAME], after[U_NAME]);
1819 if ((rc = user_rename(ldap_handle, dn_path, before[U_NAME],
1820 after[U_NAME])) != LDAP_SUCCESS)
1827 com_err(whoami, 0, "updating user %s information", after[U_NAME]);
1829 rc = user_update(ldap_handle, dn_path, after[U_NAME],
1830 after[U_UID], after[U_MITID],
1831 after_user_id, atoi(after[U_STATE]),
1832 after[U_HOMEDIR], after[U_PROFILEDIR],
1833 after[U_FIRST], after[U_MIDDLE], after[U_LAST],
1834 after[U_SHELL], after[U_CLASS]);
1839 int construct_newvalues(LK_ENTRY *linklist_base, int modvalue_count,
1840 char *oldValue, char *newValue,
1841 char ***modvalues, int type)
1843 LK_ENTRY *linklist_ptr;
1847 if (((*modvalues) = calloc(1,
1848 (modvalue_count + 1) * sizeof(char *))) == NULL)
1853 for (i = 0; i < (modvalue_count + 1); i++)
1854 (*modvalues)[i] = NULL;
1856 if (modvalue_count != 0)
1858 linklist_ptr = linklist_base;
1859 for (i = 0; i < modvalue_count; i++)
1861 if ((oldValue != NULL) && (newValue != NULL))
1863 if ((cPtr = (char *)strstr(linklist_ptr->value, oldValue))
1866 if (type == REPLACE)
1868 if (((*modvalues)[i] = calloc(1, strlen(newValue) + 1))
1871 memset((*modvalues)[i], '\0', strlen(newValue) + 1);
1872 strcpy((*modvalues)[i], newValue);
1876 if (((*modvalues)[i] = calloc(1,
1877 (int)(cPtr - linklist_ptr->value) +
1878 (linklist_ptr->length -
1880 strlen(newValue) + 1)) == NULL)
1882 memset((*modvalues)[i], '\0',
1883 (int)(cPtr - linklist_ptr->value) +
1884 (linklist_ptr->length - strlen(oldValue)) +
1885 strlen(newValue) + 1);
1886 memcpy((*modvalues)[i], linklist_ptr->value,
1887 (int)(cPtr - linklist_ptr->value));
1888 strcat((*modvalues)[i], newValue);
1889 strcat((*modvalues)[i],
1890 &linklist_ptr->value[(int)(cPtr -
1891 linklist_ptr->value) + strlen(oldValue)]);
1896 (*modvalues)[i] = calloc(1, linklist_ptr->length + 1);
1897 memset((*modvalues)[i], '\0', linklist_ptr->length + 1);
1898 memcpy((*modvalues)[i], linklist_ptr->value,
1899 linklist_ptr->length);
1904 (*modvalues)[i] = calloc(1, linklist_ptr->length + 1);
1905 memset((*modvalues)[i], '\0', linklist_ptr->length + 1);
1906 memcpy((*modvalues)[i], linklist_ptr->value,
1907 linklist_ptr->length);
1909 linklist_ptr = linklist_ptr->next;
1911 (*modvalues)[i] = NULL;
1917 int linklist_build(LDAP *ldap_handle, char *dn_path, char *search_exp,
1918 char **attr_array, LK_ENTRY **linklist_base,
1919 int *linklist_count, unsigned long ScopeType)
1922 LDAPMessage *ldap_entry;
1926 (*linklist_base) = NULL;
1927 (*linklist_count) = 0;
1929 if ((rc = ldap_search_s(ldap_handle, dn_path, ScopeType,
1930 search_exp, attr_array, 0,
1931 &ldap_entry)) != LDAP_SUCCESS)
1933 if (rc != LDAP_SIZELIMIT_EXCEEDED)
1937 rc = retrieve_entries(ldap_handle, ldap_entry, linklist_base,
1940 ldap_msgfree(ldap_entry);
1944 int retrieve_entries(LDAP *ldap_handle, LDAPMessage *ldap_entry,
1945 LK_ENTRY **linklist_base, int *linklist_count)
1947 char distinguished_name[1024];
1948 LK_ENTRY *linklist_ptr;
1951 if ((ldap_entry = ldap_first_entry(ldap_handle, ldap_entry)) == NULL)
1954 memset(distinguished_name, '\0', sizeof(distinguished_name));
1955 get_distinguished_name(ldap_handle, ldap_entry, distinguished_name);
1957 if ((rc = retrieve_attributes(ldap_handle, ldap_entry, distinguished_name,
1958 linklist_base)) != 0)
1961 while ((ldap_entry = ldap_next_entry(ldap_handle, ldap_entry)) != NULL)
1963 memset(distinguished_name, '\0', sizeof(distinguished_name));
1964 get_distinguished_name(ldap_handle, ldap_entry, distinguished_name);
1966 if ((rc = retrieve_attributes(ldap_handle, ldap_entry,
1967 distinguished_name, linklist_base)) != 0)
1971 linklist_ptr = (*linklist_base);
1972 (*linklist_count) = 0;
1974 while (linklist_ptr != NULL)
1976 ++(*linklist_count);
1977 linklist_ptr = linklist_ptr->next;
1983 int retrieve_attributes(LDAP *ldap_handle, LDAPMessage *ldap_entry,
1984 char *distinguished_name, LK_ENTRY **linklist_current)
1991 if ((Attribute = ldap_first_attribute(ldap_handle, ldap_entry,
1994 retrieve_values(ldap_handle, ldap_entry, Attribute, distinguished_name,
1996 ldap_memfree(Attribute);
1997 while ((Attribute = ldap_next_attribute(ldap_handle, ldap_entry,
2000 retrieve_values(ldap_handle, ldap_entry, Attribute,
2001 distinguished_name, linklist_current);
2002 ldap_memfree(Attribute);
2006 ldap_ber_free(ptr, 0);
2011 int retrieve_values(LDAP *ldap_handle, LDAPMessage *ldap_entry,
2012 char *Attribute, char *distinguished_name,
2013 LK_ENTRY **linklist_current)
2019 LK_ENTRY *linklist_previous;
2020 LDAP_BERVAL **ber_value;
2029 SID_IDENTIFIER_AUTHORITY *sid_auth;
2030 unsigned char *subauth_count;
2031 #endif /*LDAP_BEGUG*/
2034 memset(temp, '\0', sizeof(temp));
2036 if ((!strcmp(Attribute, "objectSid")) ||
2037 (!strcmp(Attribute, "objectGUID")))
2042 ber_value = ldap_get_values_len(ldap_handle, ldap_entry, Attribute);
2043 Ptr = (void **)ber_value;
2048 str_value = ldap_get_values(ldap_handle, ldap_entry, Attribute);
2049 Ptr = (void **)str_value;
2057 if ((linklist_previous = calloc(1, sizeof(LK_ENTRY))) == NULL)
2060 memset(linklist_previous, '\0', sizeof(LK_ENTRY));
2061 linklist_previous->next = (*linklist_current);
2062 (*linklist_current) = linklist_previous;
2064 if (((*linklist_current)->attribute = calloc(1,
2065 strlen(Attribute) + 1)) == NULL)
2068 memset((*linklist_current)->attribute, '\0', strlen(Attribute) + 1);
2069 strcpy((*linklist_current)->attribute, Attribute);
2073 ber_length = (*(LDAP_BERVAL **)Ptr)->bv_len;
2075 if (((*linklist_current)->value = calloc(1, ber_length)) == NULL)
2078 memset((*linklist_current)->value, '\0', ber_length);
2079 memcpy((*linklist_current)->value,
2080 (*(LDAP_BERVAL **)Ptr)->bv_val, ber_length);
2081 (*linklist_current)->length = ber_length;
2085 if (((*linklist_current)->value = calloc(1,
2086 strlen(*Ptr) + 1)) == NULL)
2089 memset((*linklist_current)->value, '\0', strlen(*Ptr) + 1);
2090 (*linklist_current)->length = strlen(*Ptr);
2091 strcpy((*linklist_current)->value, *Ptr);
2094 (*linklist_current)->ber_value = use_bervalue;
2096 if (((*linklist_current)->dn = calloc(1,
2097 strlen(distinguished_name) + 1)) == NULL)
2100 memset((*linklist_current)->dn, '\0',
2101 strlen(distinguished_name) + 1);
2102 strcpy((*linklist_current)->dn, distinguished_name);
2105 if (!strcmp(Attribute, "objectGUID"))
2107 guid = (GUID *)((*linklist_current)->value);
2109 "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
2110 guid->Data1, guid->Data2, guid->Data3,
2111 guid->Data4[0], guid->Data4[1], guid->Data4[2],
2112 guid->Data4[3], guid->Data4[4], guid->Data4[5],
2113 guid->Data4[6], guid->Data4[7]);
2114 print_to_screen(" %20s : {%s}\n", Attribute, temp);
2116 else if (!strcmp(Attribute, "objectSid"))
2118 sid = (SID *)((*(LDAP_BERVAL **)Ptr)->bv_val);
2121 print_to_screen(" Revision = %d\n", sid->Revision);
2122 print_to_screen(" SID Identifier Authority:\n");
2123 sid_auth = &sid->IdentifierAuthority;
2124 if (sid_auth->Value[0])
2125 print_to_screen(" SECURITY_NULL_SID_AUTHORITY\n");
2126 else if (sid_auth->Value[1])
2127 print_to_screen(" SECURITY_WORLD_SID_AUTHORITY\n");
2128 else if (sid_auth->Value[2])
2129 print_to_screen(" SECURITY_LOCAL_SID_AUTHORITY\n");
2130 else if (sid_auth->Value[3])
2131 print_to_screen(" SECURITY_CREATOR_SID_AUTHORITY\n");
2132 else if (sid_auth->Value[5])
2133 print_to_screen(" SECURITY_NT_AUTHORITY\n");
2135 print_to_screen(" UNKNOWN SID AUTHORITY\n");
2136 subauth_count = GetSidSubAuthorityCount(sid);
2137 print_to_screen(" SidSubAuthorityCount = %d\n",
2139 print_to_screen(" SidSubAuthority:\n");
2140 for (i = 0; i < *subauth_count; i++)
2142 if ((subauth = GetSidSubAuthority(sid, i)) != NULL)
2143 print_to_screen(" %u\n", *subauth);
2147 else if ((!memcmp(Attribute, "userAccountControl",
2148 strlen("userAccountControl"))) ||
2149 (!memcmp(Attribute, "sAMAccountType",
2150 strlen("sAmAccountType"))))
2152 intValue = atoi(*Ptr);
2153 print_to_screen(" %20s : %ld\n",Attribute, intValue);
2155 if (!memcmp(Attribute, "userAccountControl",
2156 strlen("userAccountControl")))
2158 if (intValue & UF_ACCOUNTDISABLE)
2159 print_to_screen(" %20s : %s\n",
2160 "", "Account disabled");
2162 print_to_screen(" %20s : %s\n",
2163 "", "Account active");
2164 if (intValue & UF_HOMEDIR_REQUIRED)
2165 print_to_screen(" %20s : %s\n",
2166 "", "Home directory required");
2167 if (intValue & UF_LOCKOUT)
2168 print_to_screen(" %20s : %s\n",
2169 "", "Account locked out");
2170 if (intValue & UF_PASSWD_NOTREQD)
2171 print_to_screen(" %20s : %s\n",
2172 "", "No password required");
2173 if (intValue & UF_PASSWD_CANT_CHANGE)
2174 print_to_screen(" %20s : %s\n",
2175 "", "Cannot change password");
2176 if (intValue & UF_TEMP_DUPLICATE_ACCOUNT)
2177 print_to_screen(" %20s : %s\n",
2178 "", "Temp duplicate account");
2179 if (intValue & UF_NORMAL_ACCOUNT)
2180 print_to_screen(" %20s : %s\n",
2181 "", "Normal account");
2182 if (intValue & UF_INTERDOMAIN_TRUST_ACCOUNT)
2183 print_to_screen(" %20s : %s\n",
2184 "", "Interdomain trust account");
2185 if (intValue & UF_WORKSTATION_TRUST_ACCOUNT)
2186 print_to_screen(" %20s : %s\n",
2187 "", "Workstation trust account");
2188 if (intValue & UF_SERVER_TRUST_ACCOUNT)
2189 print_to_screen(" %20s : %s\n",
2190 "", "Server trust account");
2195 print_to_screen(" %20s : %s\n",Attribute, *Ptr);
2197 #endif /*LDAP_DEBUG*/
2200 if (str_value != NULL)
2201 ldap_value_free(str_value);
2203 if (ber_value != NULL)
2204 ldap_value_free_len(ber_value);
2207 (*linklist_current) = linklist_previous;
2212 int moira_connect(void)
2217 if (!mr_connections++)
2221 memset(HostName, '\0', sizeof(HostName));
2222 strcpy(HostName, "ttsp");
2223 rc = mr_connect_cl(HostName, "ldap.incr", QUERY_VERSION, 1);
2227 rc = mr_connect_cl(uts.nodename, "ldap.incr", QUERY_VERSION, 1);
2236 int check_winad(void)
2240 for (i = 0; file_exists(STOP_FILE); i++)
2244 critical_alert(whoami, "Ldap incremental",
2245 "Ldap incremental failed (%s exists): %s",
2246 STOP_FILE, tbl_buf);
2256 int moira_disconnect(void)
2259 if (!--mr_connections)
2267 void get_distinguished_name(LDAP *ldap_handle, LDAPMessage *ldap_entry,
2268 char *distinguished_name)
2272 CName = ldap_get_dn(ldap_handle, ldap_entry);
2277 strcpy(distinguished_name, CName);
2278 ldap_memfree(CName);
2281 int linklist_create_entry(char *attribute, char *value,
2282 LK_ENTRY **linklist_entry)
2284 (*linklist_entry) = calloc(1, sizeof(LK_ENTRY));
2286 if (!(*linklist_entry))
2291 memset((*linklist_entry), '\0', sizeof(LK_ENTRY));
2292 (*linklist_entry)->attribute = calloc(1, strlen(attribute) + 1);
2293 memset((*linklist_entry)->attribute, '\0', strlen(attribute) + 1);
2294 strcpy((*linklist_entry)->attribute, attribute);
2295 (*linklist_entry)->value = calloc(1, strlen(value) + 1);
2296 memset((*linklist_entry)->value, '\0', strlen(value) + 1);
2297 strcpy((*linklist_entry)->value, value);
2298 (*linklist_entry)->length = strlen(value);
2299 (*linklist_entry)->next = NULL;
2304 void print_to_screen(const char *fmt, ...)
2308 va_start(pvar, fmt);
2309 vfprintf(stderr, fmt, pvar);
2314 int get_group_membership(char *group_membership, char *group_ou,
2315 int *security_flag, char **av)
2320 maillist_flag = atoi(av[L_MAILLIST]);
2321 group_flag = atoi(av[L_GROUP]);
2323 if (security_flag != NULL)
2324 (*security_flag) = 0;
2326 if ((maillist_flag) && (group_flag))
2328 if (group_membership != NULL)
2329 group_membership[0] = 'B';
2331 if (security_flag != NULL)
2332 (*security_flag) = 1;
2334 if (group_ou != NULL)
2335 strcpy(group_ou, group_ou_both);
2337 else if ((!maillist_flag) && (group_flag))
2339 if (group_membership != NULL)
2340 group_membership[0] = 'S';
2342 if (security_flag != NULL)
2343 (*security_flag) = 1;
2345 if (group_ou != NULL)
2346 strcpy(group_ou, group_ou_security);
2348 else if ((maillist_flag) && (!group_flag))
2350 if (group_membership != NULL)
2351 group_membership[0] = 'D';
2353 if (group_ou != NULL)
2354 strcpy(group_ou, group_ou_distribution);
2358 if (group_membership != NULL)
2359 group_membership[0] = 'N';
2361 if (group_ou != NULL)
2362 strcpy(group_ou, group_ou_neither);
2368 int group_rename(LDAP *ldap_handle, char *dn_path,
2369 char *before_group_name, char *before_group_membership,
2370 char *before_group_ou, int before_security_flag,
2371 char *before_desc, char *after_group_name,
2372 char *after_group_membership, char *after_group_ou,
2373 int after_security_flag, char *after_desc,
2374 char *MoiraId, char *filter, char *maillist, char *nfsgroup)
2379 char new_dn_path[512];
2382 char mail_nickname[256];
2383 char proxy_address[256];
2384 char address_book[256];
2385 char *attr_array[3];
2386 char *mitMoiraId_v[] = {NULL, NULL};
2387 char *name_v[] = {NULL, NULL};
2388 char *samAccountName_v[] = {NULL, NULL};
2389 char *groupTypeControl_v[] = {NULL, NULL};
2390 char *mail_v[] = {NULL, NULL};
2391 char *proxy_address_v[] = {NULL, NULL};
2392 char *mail_nickname_v[] = {NULL, NULL};
2393 char *report_to_originator_v[] = {NULL, NULL};
2394 char *address_book_v[] = {NULL, NULL};
2395 char *legacy_exchange_dn_v[] = {NULL, NULL};
2396 char *null_v[] = {NULL, NULL};
2397 u_int groupTypeControl;
2398 char groupTypeControlStr[80];
2399 char contact_mail[256];
2403 LK_ENTRY *group_base;
2405 int MailDisabled = 0;
2406 char search_filter[1024];
2408 if(UseGroupUniversal)
2409 groupTypeControl = ADS_GROUP_TYPE_UNIVERSAL_GROUP;
2411 groupTypeControl = ADS_GROUP_TYPE_GLOBAL_GROUP;
2413 if (!check_string(before_group_name))
2416 "Unable to process invalid LDAP list name %s",
2418 return(AD_INVALID_NAME);
2421 if (!check_string(after_group_name))
2424 "Unable to process invalid LDAP list name %s", after_group_name);
2425 return(AD_INVALID_NAME);
2435 sprintf(search_filter, "(&(objectClass=user)(cn=%s))",
2437 attr_array[0] = "cn";
2438 attr_array[1] = NULL;
2440 if ((rc = linklist_build(ldap_handle, dn_path, search_filter,
2441 attr_array, &group_base, &group_count,
2442 LDAP_SCOPE_SUBTREE)) != 0)
2444 com_err(whoami, 0, "Unable to process group %s : %s",
2445 after_group_name, ldap_err2string(rc));
2451 com_err(whoami, 0, "Object already exists with name %s",
2456 linklist_free(group_base);
2465 if (rc = ad_get_group(ldap_handle, dn_path, before_group_name,
2466 before_group_membership,
2467 MoiraId, "samAccountName", &group_base,
2468 &group_count, filter))
2471 if (group_count == 0)
2473 return(AD_NO_GROUPS_FOUND);
2476 if (group_count != 1)
2478 com_err(whoami, 0, "Unable to process multiple groups with "
2479 "MoiraId = %s exist in the directory", MoiraId);
2480 return(AD_MULTIPLE_GROUPS_FOUND);
2483 strcpy(old_dn, group_base->dn);
2485 linklist_free(group_base);
2488 attr_array[0] = "sAMAccountName";
2489 attr_array[1] = NULL;
2491 if ((rc = linklist_build(ldap_handle, dn_path, filter, attr_array,
2492 &group_base, &group_count,
2493 LDAP_SCOPE_SUBTREE)) != 0)
2495 com_err(whoami, 0, "Unable to get list %s dn : %s",
2496 after_group_name, ldap_err2string(rc));
2500 if (group_count != 1)
2503 "Unable to get sAMAccountName for group %s",
2505 return(AD_LDAP_FAILURE);
2508 strcpy(sam_name, group_base->value);
2509 linklist_free(group_base);
2513 sprintf(new_dn_path, "%s,%s", after_group_ou, dn_path);
2514 sprintf(new_dn, "cn=%s", after_group_name);
2515 sprintf(mail, "%s@%s", after_group_name, lowercase(ldap_domain));
2516 sprintf(contact_mail, "%s@mit.edu", after_group_name);
2517 sprintf(proxy_address, "SMTP:%s@%s", after_group_name,
2518 lowercase(ldap_domain));
2519 sprintf(mail_nickname, "%s", after_group_name);
2521 com_err(whoami, 0, "Old %s New %s,%s", old_dn, new_dn, new_dn_path);
2523 if ((rc = ldap_rename_s(ldap_handle, old_dn, new_dn, new_dn_path,
2524 TRUE, NULL, NULL)) != LDAP_SUCCESS)
2526 com_err(whoami, 0, "Unable to rename list from %s to %s : %s",
2527 before_group_name, after_group_name, ldap_err2string(rc));
2531 name_v[0] = after_group_name;
2533 if (!strncmp(&sam_name[strlen(sam_name) - strlen(group_suffix)],
2534 group_suffix, strlen(group_suffix)))
2536 sprintf(sam_name, "%s%s", after_group_name, group_suffix);
2541 "Unable to rename list from %s to %s : sAMAccountName not found",
2542 before_group_name, after_group_name);
2546 samAccountName_v[0] = sam_name;
2548 if (after_security_flag)
2549 groupTypeControl |= ADS_GROUP_TYPE_SECURITY_ENABLED;
2551 sprintf(groupTypeControlStr, "%ld", groupTypeControl);
2552 groupTypeControl_v[0] = groupTypeControlStr;
2553 mitMoiraId_v[0] = MoiraId;
2555 sprintf(new_dn, "cn=%s,%s,%s", after_group_name, after_group_ou, dn_path);
2556 rc = attribute_update(ldap_handle, new_dn, after_desc, "description",
2559 ADD_ATTR("samAccountName", samAccountName_v, LDAP_MOD_REPLACE);
2560 ADD_ATTR("displayName", name_v, LDAP_MOD_REPLACE);
2561 ADD_ATTR("mitMoiraId", mitMoiraId_v, LDAP_MOD_REPLACE);
2562 ADD_ATTR("groupType", groupTypeControl_v, LDAP_MOD_REPLACE);
2566 if(atoi(maillist) && !MailDisabled && email_isvalid(mail))
2568 mail_nickname_v[0] = mail_nickname;
2569 proxy_address_v[0] = proxy_address;
2571 report_to_originator_v[0] = "TRUE";
2573 ADD_ATTR("mailNickName", mail_nickname_v, LDAP_MOD_REPLACE);
2574 ADD_ATTR("mail", mail_v, LDAP_MOD_REPLACE);
2575 ADD_ATTR("proxyAddresses", proxy_address_v, LDAP_MOD_REPLACE);
2576 ADD_ATTR("reportToOriginator", report_to_originator_v,
2581 mail_nickname_v[0] = NULL;
2582 proxy_address_v[0] = NULL;
2584 legacy_exchange_dn_v[0] = NULL;
2585 address_book_v[0] = NULL;
2586 report_to_originator_v[0] = NULL;
2588 ADD_ATTR("mailNickName", mail_nickname_v, LDAP_MOD_REPLACE);
2589 ADD_ATTR("mail", mail_v, LDAP_MOD_REPLACE);
2590 ADD_ATTR("proxyAddresses", proxy_address_v, LDAP_MOD_REPLACE);
2591 ADD_ATTR("legacyExchangeDN", legacy_exchange_dn_v, LDAP_MOD_REPLACE);
2592 ADD_ATTR("showInAddressBook", address_book_v, LDAP_MOD_REPLACE);
2593 ADD_ATTR("reportToOriginator", report_to_originator_v,
2599 if(atoi(maillist) && email_isvalid(contact_mail))
2601 mail_v[0] = contact_mail;
2602 ADD_ATTR("mail", mail_v, LDAP_MOD_REPLACE);
2604 if(!ActiveDirectory)
2606 null_v[0] = "/dev/null";
2607 ADD_ATTR("mailRoutingAddress", null_v, LDAP_MOD_REPLACE);
2608 ADD_ATTR("mitMoiraMail", mail_v, LDAP_MOD_REPLACE);
2615 if ((rc = ldap_modify_s(ldap_handle, new_dn, mods)) != LDAP_SUCCESS)
2618 "Unable to modify list data for %s after renaming: %s",
2619 after_group_name, ldap_err2string(rc));
2622 for (i = 0; i < n; i++)
2628 int group_create(int ac, char **av, void *ptr)
2633 char new_group_name[256];
2634 char sam_group_name[256];
2635 char cn_group_name[256];
2637 char contact_mail[256];
2638 char mail_nickname[256];
2639 char proxy_address[256];
2640 char address_book[256];
2641 char *cn_v[] = {NULL, NULL};
2642 char *objectClass_v[] = {"top", "group", NULL};
2643 char *objectClass_ldap_v[] = {"top", "microsoftComTop", "securityPrincipal",
2644 "group", "mailRecipient", NULL};
2646 char *samAccountName_v[] = {NULL, NULL};
2647 char *altSecurityIdentities_v[] = {NULL, NULL};
2648 char *member_v[] = {NULL, NULL};
2649 char *name_v[] = {NULL, NULL};
2650 char *desc_v[] = {NULL, NULL};
2651 char *info_v[] = {NULL, NULL};
2652 char *mitMoiraId_v[] = {NULL, NULL};
2653 char *mitMoiraPublic_v[] = {NULL, NULL};
2654 char *mitMoiraHidden_v[] = {NULL, NULL};
2655 char *mitMoiraActive_v[] = {NULL, NULL};
2656 char *mitMoiraNFSGroup_v[] = {NULL, NULL};
2657 char *groupTypeControl_v[] = {NULL, NULL};
2658 char *mail_v[] = {NULL, NULL};
2659 char *proxy_address_v[] = {NULL, NULL};
2660 char *mail_nickname_v[] = {NULL, NULL};
2661 char *report_to_originator_v[] = {NULL, NULL};
2662 char *address_book_v[] = {NULL, NULL};
2663 char *legacy_exchange_dn_v[] = {NULL, NULL};
2664 char *gidNumber_v[] = {NULL, NULL};
2665 char *null_v[] = {NULL, NULL};
2666 char groupTypeControlStr[80];
2667 char group_membership[1];
2670 u_int groupTypeControl;
2674 int MailDisabled = 0;
2676 LK_ENTRY *group_base;
2679 char *attr_array[3];
2683 if(UseGroupUniversal)
2684 groupTypeControl = ADS_GROUP_TYPE_UNIVERSAL_GROUP;
2686 groupTypeControl = ADS_GROUP_TYPE_GLOBAL_GROUP;
2688 if (!check_string(av[L_NAME]))
2690 com_err(whoami, 0, "Unable to process invalid LDAP list name %s",
2692 return(AD_INVALID_NAME);
2695 updateGroup = (int)call_args[4];
2696 memset(group_ou, 0, sizeof(group_ou));
2697 memset(group_membership, 0, sizeof(group_membership));
2700 get_group_membership(group_membership, group_ou, &security_flag, av);
2702 strcpy(new_group_name, av[L_NAME]);
2703 sprintf(new_dn, "cn=%s,%s,%s", new_group_name, group_ou, call_args[1]);
2704 sprintf(contact_mail, "%s@mit.edu", av[L_NAME]);
2705 sprintf(mail, "%s@%s", av[L_NAME], lowercase(ldap_domain));
2706 sprintf(mail_nickname, "%s", av[L_NAME]);
2709 groupTypeControl |= ADS_GROUP_TYPE_SECURITY_ENABLED;
2711 sprintf(sam_group_name, "%s%s", av[L_NAME], group_suffix);
2715 sprintf(groupTypeControlStr, "%ld", groupTypeControl);
2716 groupTypeControl_v[0] = groupTypeControlStr;
2718 strcpy(cn_group_name, av[L_NAME]);
2720 samAccountName_v[0] = sam_group_name;
2721 name_v[0] = new_group_name;
2722 cn_v[0] = new_group_name;
2725 ADD_ATTR("cn", cn_v, LDAP_MOD_ADD);
2729 ADD_ATTR("objectClass", objectClass_v, LDAP_MOD_ADD);
2733 mitMoiraPublic_v[0] = av[L_PUBLIC];
2734 mitMoiraHidden_v[0] = av[L_HIDDEN];
2735 mitMoiraActive_v[0] = av[L_ACTIVE];
2736 mitMoiraNFSGroup_v[0] = av[L_NFSGROUP];
2737 ADD_ATTR("objectClass", objectClass_ldap_v, LDAP_MOD_ADD);
2738 ADD_ATTR("mitMoiraPublic", mitMoiraPublic_v, LDAP_MOD_ADD);
2739 ADD_ATTR("mitMoiraHidden", mitMoiraHidden_v, LDAP_MOD_ADD);
2740 ADD_ATTR("mitMoiraActive", mitMoiraActive_v, LDAP_MOD_ADD);
2741 ADD_ATTR("mitMoiraNFSGroup", mitMoiraNFSGroup_v, LDAP_MOD_ADD);
2743 if(atoi(av[L_GROUP]))
2745 gidNumber_v[0] = av[L_GID];
2746 ADD_ATTR("gidNumber", gidNumber_v, LDAP_MOD_ADD);
2750 ADD_ATTR("sAMAccountName", samAccountName_v, LDAP_MOD_ADD);
2751 ADD_ATTR("displayName", name_v, LDAP_MOD_ADD);
2752 ADD_ATTR("name", name_v, LDAP_MOD_ADD);
2756 if(atoi(av[L_MAILLIST]))
2761 sprintf(filter, "(&(objectClass=user)(cn=%s))", av[L_NAME]);
2762 attr_array[0] = "cn";
2763 attr_array[1] = NULL;
2765 if ((rc = linklist_build((LDAP *)call_args[0], call_args[1],
2766 filter, attr_array, &group_base,
2768 LDAP_SCOPE_SUBTREE)) != 0)
2770 com_err(whoami, 0, "Unable to process group %s : %s",
2771 av[L_NAME], ldap_err2string(rc));
2777 com_err(whoami, 0, "Object already exists with name %s",
2782 linklist_free(group_base);
2787 if(atoi(av[L_MAILLIST]) && !MailDisabled && email_isvalid(mail))
2789 mail_nickname_v[0] = mail_nickname;
2790 report_to_originator_v[0] = "TRUE";
2792 ADD_ATTR("mailNickName", mail_nickname_v, LDAP_MOD_ADD);
2793 ADD_ATTR("reportToOriginator", report_to_originator_v,
2799 if(atoi(av[L_MAILLIST]) && email_isvalid(contact_mail))
2801 mail_v[0] = contact_mail;
2802 ADD_ATTR("mail", mail_v, LDAP_MOD_ADD);
2804 if(!ActiveDirectory)
2806 null_v[0] = "/dev/null";
2807 ADD_ATTR("mailRoutingAddress", null_v, LDAP_MOD_ADD);
2808 ADD_ATTR("mitMoiraMail", mail_v, LDAP_MOD_ADD);
2813 if (strlen(av[L_DESC]) != 0)
2815 desc_v[0] = av[L_DESC];
2816 ADD_ATTR("description", desc_v, LDAP_MOD_ADD);
2819 ADD_ATTR("groupType", groupTypeControl_v, LDAP_MOD_ADD);
2821 if (strlen(av[L_ACE_NAME]) != 0)
2823 sprintf(info, "The Administrator of this list is: %s",
2826 ADD_ATTR("info", info_v, LDAP_MOD_ADD);
2829 if (strlen(call_args[5]) != 0)
2831 mitMoiraId_v[0] = call_args[5];
2832 ADD_ATTR("mitMoiraId", mitMoiraId_v, LDAP_MOD_ADD);
2837 rc = ldap_add_ext_s((LDAP *)call_args[0], new_dn, mods, NULL, NULL);
2839 for (i = 0; i < n; i++)
2842 if ((rc != LDAP_SUCCESS) && (rc != LDAP_ALREADY_EXISTS))
2844 com_err(whoami, 0, "Unable to create list %s in directory : %s",
2845 av[L_NAME], ldap_err2string(rc));
2851 if ((rc == LDAP_ALREADY_EXISTS) || (updateGroup))
2853 rc = attribute_update((LDAP *)call_args[0], new_dn, av[L_DESC],
2854 "description", av[L_NAME]);
2855 sprintf(info, "The Administrator of this list is: %s", av[L_ACE_NAME]);
2857 rc = attribute_update((LDAP *)call_args[0], new_dn, info, "info",
2862 if (strlen(call_args[5]) != 0)
2864 mitMoiraId_v[0] = call_args[5];
2865 ADD_ATTR("mitMoiraId", mitMoiraId_v, LDAP_MOD_REPLACE);
2868 if (!(atoi(av[L_ACTIVE])))
2871 ADD_ATTR("member", member_v, LDAP_MOD_REPLACE);
2874 if (!ActiveDirectory)
2876 mitMoiraPublic_v[0] = av[L_PUBLIC];
2877 mitMoiraHidden_v[0] = av[L_HIDDEN];
2878 mitMoiraActive_v[0] = av[L_ACTIVE];
2879 mitMoiraNFSGroup_v[0] = av[L_NFSGROUP];
2880 ADD_ATTR("mitMoiraPublic", mitMoiraPublic_v, LDAP_MOD_REPLACE);
2881 ADD_ATTR("mitMoiraHidden", mitMoiraHidden_v, LDAP_MOD_REPLACE);
2882 ADD_ATTR("mitMoiraActive", mitMoiraActive_v, LDAP_MOD_REPLACE);
2883 ADD_ATTR("mitMoiraNFSGroup", mitMoiraNFSGroup_v, LDAP_MOD_REPLACE);
2885 if(atoi(av[L_GROUP]))
2887 gidNumber_v[0] = av[L_GID];
2888 ADD_ATTR("gidNumber", gidNumber_v, LDAP_MOD_REPLACE);
2892 ADD_ATTR("gidNumber", gidNumber_v, LDAP_MOD_REPLACE);
2898 if(atoi(av[L_MAILLIST]))
2903 sprintf(filter, "(&(objectClass=user)(cn=%s))", av[L_NAME]);
2904 attr_array[0] = "cn";
2905 attr_array[1] = NULL;
2907 if ((rc = linklist_build((LDAP *)call_args[0], call_args[1],
2908 filter, attr_array, &group_base,
2910 LDAP_SCOPE_SUBTREE)) != 0)
2912 com_err(whoami, 0, "Unable to process group %s : %s",
2913 av[L_NAME], ldap_err2string(rc));
2919 com_err(whoami, 0, "Object already exists with name %s",
2924 linklist_free(group_base);
2929 if (atoi(av[L_MAILLIST]) && !MailDisabled && email_isvalid(mail))
2931 mail_nickname_v[0] = mail_nickname;
2932 report_to_originator_v[0] = "TRUE";
2934 ADD_ATTR("mailNickName", mail_nickname_v, LDAP_MOD_REPLACE);
2935 ADD_ATTR("reportToOriginator", report_to_originator_v,
2941 mail_nickname_v[0] = NULL;
2942 proxy_address_v[0] = NULL;
2943 legacy_exchange_dn_v[0] = NULL;
2944 address_book_v[0] = NULL;
2945 report_to_originator_v[0] = NULL;
2947 ADD_ATTR("mailNickName", mail_nickname_v, LDAP_MOD_REPLACE);
2948 ADD_ATTR("proxyAddresses", proxy_address_v, LDAP_MOD_REPLACE);
2949 ADD_ATTR("mail", mail_v, LDAP_MOD_REPLACE);
2950 ADD_ATTR("legacyExchangeDN", legacy_exchange_dn_v,
2952 ADD_ATTR("showInAddressBook", address_book_v, LDAP_MOD_REPLACE);
2953 ADD_ATTR("reportToOriginator", report_to_originator_v,
2959 if (atoi(av[L_MAILLIST]) && email_isvalid(contact_mail))
2961 mail_v[0] = contact_mail;
2962 ADD_ATTR("mail", mail_v, LDAP_MOD_REPLACE);
2964 if(!ActiveDirectory)
2966 null_v[0] = "/dev/null";
2967 ADD_ATTR("mailRoutingAddress", null_v, LDAP_MOD_REPLACE);
2968 ADD_ATTR("mitMoiraMail", mail_v, LDAP_MOD_REPLACE);
2974 ADD_ATTR("mail", mail_v, LDAP_MOD_REPLACE);
2976 if(!ActiveDirectory)
2979 ADD_ATTR("mailRoutingAddress", null_v, LDAP_MOD_REPLACE);
2980 ADD_ATTR("mitMoiraMail", mail_v, LDAP_MOD_REPLACE);
2990 rc = ldap_modify_s((LDAP *)call_args[0], new_dn, mods);
2992 for (i = 0; i < n; i++)
2995 if (rc != LDAP_SUCCESS)
2997 com_err(whoami, 0, "Unable to update list %s in directory : %s",
2998 av[L_NAME], ldap_err2string(rc));
3005 ProcessGroupSecurity((LDAP *)call_args[0], call_args[1], av[L_NAME],
3006 atoi(av[L_HIDDEN]), av[L_ACE_TYPE], av[L_ACE_NAME]);
3008 return(LDAP_SUCCESS);
3011 int ProcessGroupSecurity(LDAP *ldap_handle, char *dn_path,
3012 char *TargetGroupName, int HiddenGroup,
3013 char *AceType, char *AceName)
3015 char filter_exp[1024];
3016 char *attr_array[5];
3017 char search_path[512];
3019 char TemplateDn[512];
3020 char TemplateSamName[128];
3022 char TargetSamName[128];
3023 char AceSamAccountName[128];
3025 unsigned char AceSid[128];
3026 unsigned char UserTemplateSid[128];
3027 char acBERBuf[N_SD_BER_BYTES];
3028 char GroupSecurityTemplate[256];
3029 char hide_addres_lists[256];
3030 char address_book[256];
3031 char *hide_address_lists_v[] = {NULL, NULL};
3032 char *address_book_v[] = {NULL, NULL};
3033 char *owner_v[] = {NULL, NULL};
3035 int UserTemplateSidCount;
3042 int array_count = 0;
3044 LK_ENTRY *group_base;
3045 LDAP_BERVAL **ppsValues;
3046 LDAPControl sControl = {"1.2.840.113556.1.4.801",
3047 { N_SD_BER_BYTES, acBERBuf },
3050 LDAPControl *apsServerControls[] = {&sControl, NULL};
3053 dwInfo = OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION |
3054 DACL_SECURITY_INFORMATION | SACL_SECURITY_INFORMATION;
3055 BEREncodeSecurityBits(dwInfo, acBERBuf);
3057 sprintf(search_path, "%s,%s", group_ou_root, dn_path);
3058 sprintf(filter_exp, "(sAMAccountName=%s%s)", TargetGroupName, group_suffix);
3059 attr_array[0] = "sAMAccountName";
3060 attr_array[1] = NULL;
3064 if ((rc = linklist_build(ldap_handle, search_path, filter_exp, attr_array,
3065 &group_base, &group_count,
3066 LDAP_SCOPE_SUBTREE) != 0))
3069 if (group_count != 1)
3071 linklist_free(group_base);
3075 strcpy(TargetDn, group_base->dn);
3076 strcpy(TargetSamName, group_base->value);
3077 linklist_free(group_base);
3081 UserTemplateSidCount = 0;
3082 memset(UserTemplateSid, '\0', sizeof(UserTemplateSid));
3083 memset(AceSamAccountName, '\0', sizeof(AceSamAccountName));
3084 memset(AceSid, '\0', sizeof(AceSid));
3089 if (strlen(AceName) != 0)
3091 if (!strcmp(AceType, "LIST"))
3093 sprintf(AceSamAccountName, "%s%s", AceName, group_suffix);
3094 strcpy(root_ou, group_ou_root);
3096 else if (!strcmp(AceType, "USER"))
3098 sprintf(AceSamAccountName, "%s", AceName);
3099 strcpy(root_ou, user_ou);
3102 if (ActiveDirectory)
3104 if (strlen(AceSamAccountName) != 0)
3106 sprintf(search_path, "%s", dn_path);
3107 sprintf(filter_exp, "(sAMAccountName=%s)", AceSamAccountName);
3108 attr_array[0] = "objectSid";
3109 attr_array[1] = NULL;
3113 if ((rc = linklist_build(ldap_handle, search_path, filter_exp,
3114 attr_array, &group_base, &group_count,
3115 LDAP_SCOPE_SUBTREE) != 0))
3117 if (group_count == 1)
3119 strcpy(AceDn, group_base->dn);
3120 AceSidCount = group_base->length;
3121 memcpy(AceSid, group_base->value, AceSidCount);
3123 linklist_free(group_base);
3130 if (strlen(AceSamAccountName) != 0)
3132 sprintf(search_path, "%s", dn_path);
3133 sprintf(filter_exp, "(sAMAccountName=%s)", AceSamAccountName);
3134 attr_array[0] = "samAccountName";
3135 attr_array[1] = NULL;
3139 if ((rc = linklist_build(ldap_handle, search_path, filter_exp,
3140 attr_array, &group_base, &group_count,
3141 LDAP_SCOPE_SUBTREE) != 0))
3143 if (group_count == 1)
3145 strcpy(AceDn, group_base->dn);
3147 linklist_free(group_base);
3154 if (!ActiveDirectory)
3156 if (strlen(AceDn) != 0)
3158 owner_v[0] = strdup(AceDn);
3160 ADD_ATTR("owner", owner_v, LDAP_MOD_REPLACE);
3164 rc = ldap_modify_s(ldap_handle, TargetDn, mods);
3166 for (i = 0; i < n; i++)
3169 if (rc != LDAP_SUCCESS)
3170 com_err(whoami, 0, "Unable to set owner for group %s : %s",
3171 TargetGroupName, ldap_err2string(rc));
3177 if (AceSidCount == 0)
3179 com_err(whoami, 0, "Group %s: Administrator: %s, Type: %s - does not "
3180 "have a directory SID.", TargetGroupName, AceName, AceType);
3181 com_err(whoami, 0, " Non-admin security group template will be used.");
3185 sprintf(search_path, "%s,%s", security_template_ou, dn_path);
3186 sprintf(filter_exp, "(sAMAccountName=%s)", "UserTemplate.u");
3187 attr_array[0] = "objectSid";
3188 attr_array[1] = NULL;
3193 if ((rc = linklist_build(ldap_handle, search_path, filter_exp,
3194 attr_array, &group_base, &group_count,
3195 LDAP_SCOPE_SUBTREE) != 0))
3198 if ((rc != 0) || (group_count != 1))
3200 com_err(whoami, 0, "Unable to process user security template: %s",
3206 UserTemplateSidCount = group_base->length;
3207 memcpy(UserTemplateSid, group_base->value, UserTemplateSidCount);
3209 linklist_free(group_base);
3216 if (AceSidCount == 0)
3218 strcpy(GroupSecurityTemplate, HIDDEN_GROUP);
3219 sprintf(filter_exp, "(sAMAccountName=%s)", HIDDEN_GROUP);
3223 strcpy(GroupSecurityTemplate, HIDDEN_GROUP_WITH_ADMIN);
3224 sprintf(filter_exp, "(sAMAccountName=%s)", HIDDEN_GROUP_WITH_ADMIN);
3229 if (AceSidCount == 0)
3231 strcpy(GroupSecurityTemplate, NOT_HIDDEN_GROUP);
3232 sprintf(filter_exp, "(sAMAccountName=%s)", NOT_HIDDEN_GROUP);
3236 strcpy(GroupSecurityTemplate, NOT_HIDDEN_GROUP_WITH_ADMIN);
3237 sprintf(filter_exp, "(sAMAccountName=%s)",
3238 NOT_HIDDEN_GROUP_WITH_ADMIN);
3242 sprintf(search_path, "%s,%s", security_template_ou, dn_path);
3243 attr_array[0] = "sAMAccountName";
3244 attr_array[1] = NULL;
3248 if ((rc = linklist_build(ldap_handle, search_path, filter_exp, attr_array,
3249 &group_base, &group_count,
3250 LDAP_SCOPE_SUBTREE) != 0))
3253 if (group_count != 1)
3255 linklist_free(group_base);
3256 com_err(whoami, 0, "Unable to process group security template: %s - "
3257 "security not set", GroupSecurityTemplate);
3261 strcpy(TemplateDn, group_base->dn);
3262 strcpy(TemplateSamName, group_base->value);
3263 linklist_free(group_base);
3267 sprintf(filter_exp, "(sAMAccountName=%s)", TemplateSamName);
3268 rc = ldap_search_ext_s(ldap_handle,
3280 if ((psMsg = ldap_first_entry(ldap_handle, psMsg)) == NULL)
3282 com_err(whoami, 0, "Unable to find group security template: %s - "
3283 "security not set", GroupSecurityTemplate);
3287 ppsValues = ldap_get_values_len(ldap_handle, psMsg, "ntSecurityDescriptor");
3289 if (ppsValues == NULL)
3291 com_err(whoami, 0, "Unable to find group security descriptor for group "
3292 "%s - security not set", GroupSecurityTemplate);
3296 if (AceSidCount != 0)
3298 for (nVal = 0; ppsValues[nVal] != NULL; nVal++)
3301 i < (int)(ppsValues[nVal]->bv_len - UserTemplateSidCount); i++)
3303 if (!memcmp(&ppsValues[nVal]->bv_val[i], UserTemplateSid,
3304 UserTemplateSidCount))
3306 memcpy(&ppsValues[nVal]->bv_val[i], AceSid, AceSidCount);
3314 ADD_ATTR("ntSecurityDescriptor", (char **)ppsValues,
3315 LDAP_MOD_REPLACE | LDAP_MOD_BVALUES);
3321 hide_address_lists_v[0] = "TRUE";
3322 address_book_v[0] = NULL;
3323 ADD_ATTR("msExchHideFromAddressLists", hide_address_lists_v,
3325 ADD_ATTR("showInAddressBook", address_book_v, LDAP_MOD_REPLACE);
3327 hide_address_lists_v[0] = NULL;
3328 ADD_ATTR("msExchHideFromAddressLists", hide_address_lists_v,
3335 rc = ldap_modify_s(ldap_handle, TargetDn, mods);
3337 for (i = 0; i < n; i++)
3340 ldap_value_free_len(ppsValues);
3341 ldap_msgfree(psMsg);
3343 if (rc != LDAP_SUCCESS)
3345 com_err(whoami, 0, "Unable to set security settings for group %s : %s",
3346 TargetGroupName, ldap_err2string(rc));
3348 if (AceSidCount != 0)
3351 "Trying to set security for group %s without admin.",
3354 if (rc = ProcessGroupSecurity(ldap_handle, dn_path, TargetGroupName,
3355 HiddenGroup, "", ""))
3357 com_err(whoami, 0, "Unable to set security for group %s.",
3368 int group_delete(LDAP *ldap_handle, char *dn_path, char *group_name,
3369 char *group_membership, char *MoiraId)
3371 LK_ENTRY *group_base;
3377 if (!check_string(group_name))
3380 "Unable to process invalid LDAP list name %s", group_name);
3381 return(AD_INVALID_NAME);
3384 memset(filter, '\0', sizeof(filter));
3387 sprintf(temp, "%s,%s", group_ou_root, dn_path);
3389 if (rc = ad_get_group(ldap_handle, temp, group_name,
3390 group_membership, MoiraId,
3391 "samAccountName", &group_base,
3392 &group_count, filter))
3395 if (group_count == 1)
3397 if ((rc = ldap_delete_s(ldap_handle, group_base->dn)) != LDAP_SUCCESS)
3399 linklist_free(group_base);
3400 com_err(whoami, 0, "Unable to delete list %s from directory : %s",
3401 group_name, ldap_err2string(rc));
3404 linklist_free(group_base);
3408 linklist_free(group_base);
3409 com_err(whoami, 0, "Unable to find list %s in directory.", group_name);
3410 return(AD_NO_GROUPS_FOUND);
3416 int BEREncodeSecurityBits(ULONG uBits, char *pBuffer)
3422 return(N_SD_BER_BYTES);
3425 int process_lists(int ac, char **av, void *ptr)
3430 char group_membership[2];
3436 memset(group_ou, '\0', sizeof(group_ou));
3437 memset(group_membership, '\0', sizeof(group_membership));
3438 get_group_membership(group_membership, group_ou, &security_flag, av);
3439 rc = populate_group((LDAP *)call_args[0], (char *)call_args[1],
3440 av[L_NAME], group_ou, group_membership,
3441 security_flag, "", 1);
3446 int member_list_build(int ac, char **av, void *ptr)
3454 strcpy(temp, av[ACE_NAME]);
3457 if (!check_string(temp))
3460 if (!strcmp(av[ACE_TYPE], "USER"))
3462 if (!((int)call_args[3] & MOIRA_USERS))
3465 else if (!strcmp(av[ACE_TYPE], "STRING"))
3469 if((s = strchr(temp, '@')) == (char *) NULL)
3472 if(!strncasecmp(&temp[strlen(temp) - 6], ".LOCAL", 6))
3476 if (!((int)call_args[3] & MOIRA_STRINGS))
3479 if (contact_create((LDAP *)call_args[0], call_args[1], temp, contact_ou))
3482 else if (!strcmp(av[ACE_TYPE], "LIST"))
3484 if (!((int)call_args[3] & MOIRA_LISTS))
3487 else if (!strcmp(av[ACE_TYPE], "KERBEROS"))
3489 if (!((int)call_args[3] & MOIRA_KERBEROS))
3492 if (contact_create((LDAP *)call_args[0], call_args[1], temp,
3497 else if (!strcmp(av[ACE_TYPE], "MACHINE"))
3499 if (!((int)call_args[3] & MOIRA_MACHINE))
3505 linklist = member_base;
3509 if (!strcasecmp(temp, linklist->member) &&
3510 !strcasecmp(av[ACE_TYPE], linklist->type))
3513 linklist = linklist->next;
3516 linklist = calloc(1, sizeof(LK_ENTRY));
3518 linklist->dn = NULL;
3519 linklist->list = calloc(1, strlen(call_args[2]) + 1);
3520 strcpy(linklist->list, call_args[2]);
3521 linklist->type = calloc(1, strlen(av[ACE_TYPE]) + 1);
3522 strcpy(linklist->type, av[ACE_TYPE]);
3523 linklist->member = calloc(1, strlen(temp) + 1);
3524 strcpy(linklist->member, temp);
3525 linklist->next = member_base;
3526 member_base = linklist;
3531 int member_remove(LDAP *ldap_handle, char *dn_path, char *group_name,
3532 char *group_ou, char *group_membership, char *user_name,
3533 char *UserOu, char *MoiraId)
3535 char distinguished_name[1024];
3539 char *attr_array[3];
3544 LK_ENTRY *group_base;
3548 if (max_group_members && (group_members < max_group_members))
3551 if (!check_string(group_name))
3552 return(AD_INVALID_NAME);
3554 if(!contains_member(ldap_handle, dn_path, group_name, UserOu,
3555 escape_string(user_name)))
3558 memset(filter, '\0', sizeof(filter));
3562 if (rc = ad_get_group(ldap_handle, dn_path, group_name,
3563 group_membership, MoiraId,
3564 "samAccountName", &group_base,
3565 &group_count, filter))
3568 if (group_count != 1)
3570 com_err(whoami, 0, "Unable to find list %s in directory",
3572 linklist_free(group_base);
3578 strcpy(distinguished_name, group_base->dn);
3579 linklist_free(group_base);
3585 sprintf(temp, "CN=%s,%s,%s", user_name, UserOu, dn_path);
3589 if(!strcmp(UserOu, user_ou))
3590 sprintf(temp, "uid=%s,%s,%s", user_name, UserOu, dn_path);
3592 sprintf(temp, "CN=%s,%s,%s", user_name, UserOu, dn_path);
3595 modvalues[0] = temp;
3596 modvalues[1] = NULL;
3599 ADD_ATTR("member", modvalues, LDAP_MOD_DELETE);
3601 rc = ldap_modify_s(ldap_handle, distinguished_name, mods);
3603 for (i = 0; i < n; i++)
3606 if (rc == LDAP_UNWILLING_TO_PERFORM)
3609 if (rc != LDAP_SUCCESS)
3611 com_err(whoami, 0, "Unable to modify list %s members : %s",
3612 group_name, ldap_err2string(rc));
3616 if ((!strcmp(UserOu, contact_ou)) || (!strcmp(UserOu, kerberos_ou)))
3620 if(!strcmp(UserOu, contact_ou) &&
3621 ((s = strstr(user_name,
3622 "@exchange-forwarding.mit.edu")) != (char *) NULL))
3624 memset(temp, '\0', sizeof(temp));
3625 strcpy(temp, user_name);
3626 s = strchr(temp, '@');
3629 sprintf(filter, "(&(objectClass=user)(mailNickName=%s))", temp);
3631 if ((rc = linklist_build(ldap_handle, dn_path, filter, NULL,
3632 &group_base, &group_count,
3633 LDAP_SCOPE_SUBTREE) != 0))
3639 linklist_free(group_base);
3644 sprintf(filter, "(distinguishedName=%s)", temp);
3645 attr_array[0] = "memberOf";
3646 attr_array[1] = NULL;
3648 if ((rc = linklist_build(ldap_handle, dn_path, filter, attr_array,
3649 &group_base, &group_count,
3650 LDAP_SCOPE_SUBTREE) != 0))
3656 com_err(whoami, 0, "Removing unreferenced object %s", temp);
3658 if ((rc = ldap_delete_s(ldap_handle, temp)) != 0)
3668 int member_add(LDAP *ldap_handle, char *dn_path, char *group_name,
3669 char *group_ou, char *group_membership, char *user_name,
3670 char *UserOu, char *MoiraId)
3672 char distinguished_name[1024];
3680 LK_ENTRY *group_base;
3683 if (max_group_members && (group_members < max_group_members))
3686 if (!check_string(group_name))
3687 return(AD_INVALID_NAME);
3689 if(contains_member(ldap_handle, dn_path, group_name, UserOu, user_name) > 0)
3693 memset(filter, '\0', sizeof(filter));
3697 if (rc = ad_get_group(ldap_handle, dn_path, group_name,
3698 group_membership, MoiraId,
3699 "samAccountName", &group_base,
3700 &group_count, filter))
3703 if (group_count != 1)
3705 linklist_free(group_base);
3708 com_err(whoami, 0, "Unable to find list %s %d in directory",
3709 group_name, group_count);
3710 return(AD_MULTIPLE_GROUPS_FOUND);
3713 strcpy(distinguished_name, group_base->dn);
3714 linklist_free(group_base);
3720 sprintf(temp, "CN=%s,%s,%s", user_name, UserOu, dn_path);
3724 if(!strcmp(UserOu, user_ou))
3725 sprintf(temp, "uid=%s,%s,%s", user_name, UserOu, dn_path);
3727 sprintf(temp, "cn=%s,%s,%s", user_name, UserOu, dn_path);
3730 modvalues[0] = temp;
3731 modvalues[1] = NULL;
3734 ADD_ATTR("member", modvalues, LDAP_MOD_ADD);
3736 rc = ldap_modify_s(ldap_handle, distinguished_name, mods);
3738 if (rc == LDAP_ALREADY_EXISTS || rc == LDAP_TYPE_OR_VALUE_EXISTS)
3741 if ((!strcmp(UserOu, contact_ou)) || (!strcmp(UserOu, kerberos_ou)))
3743 if (rc == LDAP_UNWILLING_TO_PERFORM)
3747 for (i = 0; i < n; i++)
3750 if (rc != LDAP_SUCCESS)
3752 com_err(whoami, 0, "Unable to add %s to list %s as a member : %s",
3753 user_name, group_name, ldap_err2string(rc));
3759 int contact_remove_email(LDAP *ld, char *bind_path,
3760 LK_ENTRY **linklist_base, int linklist_current)
3764 char *mail_v[] = {NULL, NULL};
3772 ADD_ATTR("mail", mail_v, LDAP_MOD_REPLACE);
3773 ADD_ATTR("mailNickName", mail_v, LDAP_MOD_REPLACE);
3774 ADD_ATTR("proxyAddresses", mail_v, LDAP_MOD_REPLACE);
3775 ADD_ATTR("targetAddress", mail_v, LDAP_MOD_REPLACE);
3778 gPtr = (*linklist_base);
3781 rc = ldap_modify_s(ld, gPtr->dn, mods);
3783 if ((rc != LDAP_SUCCESS) && (rc != LDAP_ALREADY_EXISTS))
3785 com_err(whoami, 0, "Unable to modify contact %s in directory : %s",
3786 gPtr->dn, ldap_err2string(rc));
3793 for (i = 0; i < n; i++)
3799 int contact_create(LDAP *ld, char *bind_path, char *user, char *group_ou)
3802 LK_ENTRY *group_base;
3805 char cn_user_name[256];
3806 char contact_name[256];
3807 char mail_nickname[256];
3808 char proxy_address_internal[256];
3809 char proxy_address_external[256];
3810 char target_address[256];
3811 char internal_contact_name[256];
3814 char principal[256];
3815 char mit_address_book[256];
3816 char default_address_book[256];
3817 char contact_address_book[256];
3819 char *email_v[] = {NULL, NULL};
3820 char *cn_v[] = {NULL, NULL};
3821 char *contact_v[] = {NULL, NULL};
3822 char *uid_v[] = {NULL, NULL};
3823 char *mail_nickname_v[] = {NULL, NULL};
3824 char *proxy_address_internal_v[] = {NULL, NULL};
3825 char *proxy_address_external_v[] = {NULL, NULL};
3826 char *target_address_v[] = {NULL, NULL};
3827 char *mit_address_book_v[] = {NULL, NULL};
3828 char *default_address_book_v[] = {NULL, NULL};
3829 char *contact_address_book_v[] = {NULL, NULL};
3830 char *hide_address_lists_v[] = {NULL, NULL};
3831 char *attr_array[3];
3832 char *objectClass_v[] = {"top", "person",
3833 "organizationalPerson",
3835 char *objectClass_ldap_v[] = {"top", "person", "microsoftComTop",
3836 "inetOrgPerson", "organizationalPerson",
3837 "contact", "mailRecipient", "eduPerson",
3839 char *name_v[] = {NULL, NULL};
3840 char *desc_v[] = {NULL, NULL};
3847 char *mail_routing_v[] = {NULL, NULL};
3848 char *principal_v[] = {NULL, NULL};
3850 if (!check_string(user))
3852 com_err(whoami, 0, "Unable to process invalid LDAP name %s", user);
3853 return(AD_INVALID_NAME);
3857 strcpy(contact_name, mail);
3858 strcpy(internal_contact_name, mail);
3860 if((s = strchr(internal_contact_name, '@')) != NULL) {
3864 sprintf(cn_user_name,"CN=%s,%s,%s", escape_string(contact_name), group_ou,
3867 sprintf(target_address, "SMTP:%s", contact_name);
3868 sprintf(proxy_address_external, "SMTP:%s", contact_name);
3869 sprintf(mail_nickname, "%s", internal_contact_name);
3871 cn_v[0] = cn_user_name;
3872 contact_v[0] = contact_name;
3875 desc_v[0] = "Auto account created by Moira";
3877 proxy_address_internal_v[0] = proxy_address_internal;
3878 proxy_address_external_v[0] = proxy_address_external;
3879 mail_nickname_v[0] = mail_nickname;
3880 target_address_v[0] = target_address;
3881 mit_address_book_v[0] = mit_address_book;
3882 default_address_book_v[0] = default_address_book;
3883 contact_address_book_v[0] = contact_address_book;
3884 strcpy(new_dn, cn_user_name);
3887 ADD_ATTR("cn", contact_v, LDAP_MOD_ADD);
3889 if(!ActiveDirectory)
3891 if(!strcmp(group_ou, contact_ou))
3892 sprintf(uid, "%s%s", contact_name, "_strings");
3894 if(!strcmp(group_ou, kerberos_ou))
3895 sprintf(uid, "%s%s", contact_name, "_kerberos");
3899 ADD_ATTR("sn", contact_v, LDAP_MOD_ADD);
3900 ADD_ATTR("uid", uid_v, LDAP_MOD_ADD);
3905 ADD_ATTR("objectClass", objectClass_v, LDAP_MOD_ADD);
3909 ADD_ATTR("objectClass", objectClass_ldap_v, LDAP_MOD_ADD);
3912 ADD_ATTR("name", name_v, LDAP_MOD_ADD);
3913 ADD_ATTR("displayName", name_v, LDAP_MOD_ADD);
3914 ADD_ATTR("description", desc_v, LDAP_MOD_ADD);
3918 if((s = strstr(mail, "@mit.edu")) != (char *) NULL)
3921 if (!strcmp(group_ou, contact_ou) && email_isvalid(mail))
3926 sprintf(filter, "(&(objectClass=user)(cn=%s))", mail);
3927 attr_array[0] = "cn";
3928 attr_array[1] = NULL;
3930 if ((rc = linklist_build(ld, bind_path, filter, attr_array,
3931 &group_base, &group_count,
3932 LDAP_SCOPE_SUBTREE)) != 0)
3934 com_err(whoami, 0, "Unable to process contact %s : %s",
3935 user, ldap_err2string(rc));
3941 com_err(whoami, 0, "Object already exists with name %s",
3946 linklist_free(group_base);
3950 sprintf(filter, "(&(objectClass=group)(cn=%s))", mail);
3951 attr_array[0] = "cn";
3952 attr_array[1] = NULL;
3954 if ((rc = linklist_build(ld, bind_path, filter, attr_array,
3955 &group_base, &group_count,
3956 LDAP_SCOPE_SUBTREE)) != 0)
3958 com_err(whoami, 0, "Unable to process contact %s : %s",
3959 user, ldap_err2string(rc));
3965 com_err(whoami, 0, "Object already exists with name %s",
3970 linklist_free(group_base);
3974 sprintf(filter, "(&(objectClass=user)(mail=%s))", mail);
3975 attr_array[0] = "cn";
3976 attr_array[1] = NULL;
3978 if ((rc = linklist_build(ld, bind_path, filter, attr_array,
3979 &group_base, &group_count,
3980 LDAP_SCOPE_SUBTREE)) != 0)
3982 com_err(whoami, 0, "Unable to process contact %s : %s",
3983 user, ldap_err2string(rc));
3989 com_err(whoami, 0, "Object already exists with name %s",
3994 linklist_free(group_base);
3998 sprintf(filter, "(&(objectClass=group)(mail=%s))", mail);
3999 attr_array[0] = "cn";
4000 attr_array[1] = NULL;
4002 if ((rc = linklist_build(ld, bind_path, filter, attr_array,
4003 &group_base, &group_count,
4004 LDAP_SCOPE_SUBTREE)) != 0)
4006 com_err(whoami, 0, "Unable to process contact %s : %s",
4007 user, ldap_err2string(rc));
4013 com_err(whoami, 0, "Object already exists with name %s",
4018 linklist_free(group_base);
4022 sprintf(filter, "(&(objectClass=user)(proxyAddresses=smtp:%s))", mail);
4023 attr_array[0] = "cn";
4024 attr_array[1] = NULL;
4026 if ((rc = linklist_build(ld, bind_path, filter, attr_array,
4027 &group_base, &group_count,
4028 LDAP_SCOPE_SUBTREE)) != 0)
4030 com_err(whoami, 0, "Unable to process contact %s : %s",
4031 user, ldap_err2string(rc));
4037 com_err(whoami, 0, "Object already exists with name %s",
4042 linklist_free(group_base);
4046 sprintf(filter, "(&(objectClass=group)(proxyAddresses=smtp:%s))", mail);
4047 attr_array[0] = "cn";
4048 attr_array[1] = NULL;
4050 if ((rc = linklist_build(ld, bind_path, filter, attr_array,
4051 &group_base, &group_count,
4052 LDAP_SCOPE_SUBTREE)) != 0)
4054 com_err(whoami, 0, "Unable to process contact %s : %s",
4055 user, ldap_err2string(rc));
4061 com_err(whoami, 0, "Object already exists with name %s",
4066 ADD_ATTR("mail", email_v, LDAP_MOD_ADD);
4067 ADD_ATTR("mailNickName", mail_nickname_v, LDAP_MOD_ADD);
4068 ADD_ATTR("proxyAddresses", proxy_address_external_v, LDAP_MOD_ADD);
4069 ADD_ATTR("targetAddress", target_address_v, LDAP_MOD_ADD);
4071 hide_address_lists_v[0] = "TRUE";
4072 ADD_ATTR("msExchHideFromAddressLists", hide_address_lists_v,
4077 if(!ActiveDirectory)
4079 if((c = strchr(mail, '@')) == NULL)
4080 sprintf(temp, "%s@mit.edu", mail);
4082 sprintf(temp, "%s", mail);
4084 mail_routing_v[0] = temp;
4086 principal_v[0] = principal;
4088 if(!strcmp(group_ou, contact_ou))
4090 ADD_ATTR("mailRoutingAddress", mail_routing_v, LDAP_MOD_ADD);
4091 ADD_ATTR("eduPersonPrincipalName", mail_routing_v, LDAP_MOD_ADD);
4097 rc = ldap_add_ext_s(ld, new_dn, mods, NULL, NULL);
4099 for (i = 0; i < n; i++)
4104 if ((rc != LDAP_SUCCESS) && (rc == LDAP_ALREADY_EXISTS) &&
4105 !strcmp(group_ou, contact_ou) && email_isvalid(mail))
4109 ADD_ATTR("mail", email_v, LDAP_MOD_REPLACE);
4110 ADD_ATTR("mailNickName", mail_nickname_v, LDAP_MOD_REPLACE);
4111 ADD_ATTR("proxyAddresses", proxy_address_external_v,
4113 ADD_ATTR("targetAddress", target_address_v, LDAP_MOD_REPLACE);
4115 hide_address_lists_v[0] = "TRUE";
4116 ADD_ATTR("msExchHideFromAddressLists", hide_address_lists_v,
4120 rc = ldap_modify_s(ld, new_dn, mods);
4124 com_err(whoami, 0, "Unable to update contact %s", mail);
4127 for (i = 0; i < n; i++)
4132 if ((rc != LDAP_SUCCESS) && (rc != LDAP_ALREADY_EXISTS))
4134 com_err(whoami, 0, "Unable to create contact %s : %s",
4135 user, ldap_err2string(rc));
4142 int user_update(LDAP *ldap_handle, char *dn_path, char *user_name,
4143 char *Uid, char *MitId, char *MoiraId, int State,
4144 char *WinHomeDir, char *WinProfileDir, char *first,
4145 char *middle, char *last, char *shell, char *class)
4148 LK_ENTRY *group_base;
4150 char distinguished_name[512];
4151 char displayName[256];
4152 char address_book[1024];
4153 char *mitMoiraId_v[] = {NULL, NULL};
4154 char *mitMoiraClass_v[] = {NULL, NULL};
4155 char *mitMoiraStatus_v[] = {NULL, NULL};
4156 char *uid_v[] = {NULL, NULL};
4157 char *mitid_v[] = {NULL, NULL};
4158 char *homedir_v[] = {NULL, NULL};
4159 char *winProfile_v[] = {NULL, NULL};
4160 char *drives_v[] = {NULL, NULL};
4161 char *userAccountControl_v[] = {NULL, NULL};
4162 char *alt_recipient_v[] = {NULL, NULL};
4163 char *hide_address_lists_v[] = {NULL, NULL};
4164 char *mail_v[] = {NULL, NULL};
4165 char *gid_v[] = {NULL, NULL};
4166 char *loginshell_v[] = {NULL, NULL};
4167 char *principal_v[] = {NULL, NULL};
4168 char *address_book_v[] = {NULL, NULL, NULL, NULL, NULL};
4169 char userAccountControlStr[80];
4174 u_int userAccountControl = UF_NORMAL_ACCOUNT | UF_DONT_EXPIRE_PASSWD |
4175 UF_PASSWD_CANT_CHANGE;
4177 char *attr_array[3];
4180 char filesys_name[256];
4181 char contact_mail[256];
4182 char filter_exp[1024];
4183 char search_path[512];
4184 char TemplateDn[512];
4185 char TemplateSamName[128];
4186 char alt_recipient[256];
4187 char principal[256];
4189 char acBERBuf[N_SD_BER_BYTES];
4190 LDAPControl sControl = {"1.2.840.113556.1.4.801",
4191 { N_SD_BER_BYTES, acBERBuf },
4193 LDAPControl *apsServerControls[] = {&sControl, NULL};
4195 LDAP_BERVAL **ppsValues;
4199 char *homeServerName;
4201 char search_string[256];
4203 char *mail_routing_v[] = {NULL, NULL};
4204 char *mail_alternate_v[] = {NULL, NULL};
4205 char *mit_moira_imap_address_v[] = {NULL, NULL};
4206 char *deliver_and_redirect_v[] = {NULL, NULL};
4209 dwInfo = OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION |
4210 DACL_SECURITY_INFORMATION | SACL_SECURITY_INFORMATION;
4211 BEREncodeSecurityBits(dwInfo, acBERBuf);
4213 if (!check_string(user_name))
4215 com_err(whoami, 0, "Unable to process invalid LDAP user name %s",
4217 return(AD_INVALID_NAME);
4220 memset(contact_mail, '\0', sizeof(contact_mail));
4222 sprintf(contact_mail, "%s@exchange-forwarding.mit.edu", user_name);
4224 sprintf(contact_mail, "%s@mit.edu", user_name);
4225 memset(mail, '\0', sizeof(mail));
4226 sprintf(mail, "%s@%s", user_name, lowercase(ldap_domain));
4227 memset(alt_recipient, '\0', sizeof(alt_recipient));
4228 sprintf(alt_recipient, "cn=%s@exchange-forwarding.mit.edu,%s,%s", user_name,
4229 contact_ou, dn_path);
4230 sprintf(search_string, "@%s", uppercase(ldap_domain));
4231 memset(filesys_name, '\0', sizeof(filesys_name));
4232 sprintf(filesys_name, "%s.po", user_name);
4236 if(contact_create(ldap_handle, dn_path, contact_mail, contact_ou))
4238 com_err(whoami, 0, "Unable to create user contact %s", contact_mail);
4245 memset(displayName, '\0', sizeof(displayName));
4247 if (strlen(MoiraId) != 0)
4251 sprintf(filter, "(&(objectClass=user)(mitMoiraId=%s))", MoiraId);
4256 "(&(objectClass=mitPerson)(mitMoiraId=%s))", MoiraId);
4259 attr_array[0] = "cn";
4260 attr_array[1] = NULL;
4261 if ((rc = linklist_build(ldap_handle, dn_path, filter, attr_array,
4262 &group_base, &group_count,
4263 LDAP_SCOPE_SUBTREE)) != 0)
4265 com_err(whoami, 0, "Unable to process user %s : %s",
4266 user_name, ldap_err2string(rc));
4271 if (group_count != 1)
4273 linklist_free(group_base);
4276 sprintf(filter, "(sAMAccountName=%s)", user_name);
4277 attr_array[0] = "cn";
4278 attr_array[1] = NULL;
4279 sprintf(temp, "%s,%s", user_ou, dn_path);
4280 if ((rc = linklist_build(ldap_handle, temp, filter, attr_array,
4281 &group_base, &group_count,
4282 LDAP_SCOPE_SUBTREE)) != 0)
4284 com_err(whoami, 0, "Unable to process user %s : %s",
4285 user_name, ldap_err2string(rc));
4290 if (group_count != 1)
4292 com_err(whoami, 0, "Unable to find user %s in directory",
4294 linklist_free(group_base);
4295 return(AD_NO_USER_FOUND);
4298 strcpy(distinguished_name, group_base->dn);
4300 linklist_free(group_base);
4303 if(!ActiveDirectory)
4305 if (rc = moira_connect())
4307 critical_alert(whoami, "Ldap incremental",
4308 "Error contacting Moira server : %s",
4313 argv[0] = filesys_name;
4315 if (!(rc = mr_query("get_filesys_by_label", 1, argv, save_query_info,
4319 ADD_ATTR("mitMoiraIMAPAddress", mit_moira_imap_address_v,
4322 rc = ldap_modify_s(ldap_handle, distinguished_name, mods);
4324 if (rc == LDAP_ALREADY_EXISTS || rc == LDAP_TYPE_OR_VALUE_EXISTS)
4329 "Unable to set the mitMoiraIMAPAddress for %s : %s",
4330 user_name, ldap_err2string(rc));
4332 sprintf(temp, "%s@%s", user_name, save_argv[FS_MACHINE]);
4334 mit_moira_imap_address_v[0] = temp;
4337 ADD_ATTR("mitMoiraIMAPAddress", mit_moira_imap_address_v,
4340 rc = ldap_modify_s(ldap_handle, distinguished_name, mods);
4342 if (rc == LDAP_ALREADY_EXISTS || rc == LDAP_TYPE_OR_VALUE_EXISTS)
4346 com_err(whoami, 0, "Unable to set the mitMoiraIMAPAddress for "
4347 "%s : %s", user_name, ldap_err2string(rc));
4348 } else if(rc==MR_NO_MATCH) {
4351 ADD_ATTR("mitMoiraIMAPServer", mit_moira_imap_address_v,
4354 rc = ldap_modify_s(ldap_handle, distinguished_name, mods);
4356 if (rc == LDAP_ALREADY_EXISTS || rc == LDAP_TYPE_OR_VALUE_EXISTS)
4361 "Unable to set the mitMoiraIMAPAddress for %s : %s",
4362 user_name, ldap_err2string(rc));
4366 argv[0] = user_name;
4368 if (!(rc = mr_query("get_pobox", 1, argv, save_query_info, save_argv)))
4371 ADD_ATTR("mailRoutingAddress", mail_routing_v, LDAP_MOD_REPLACE);
4373 rc = ldap_modify_s(ldap_handle, distinguished_name, mods);
4375 if (rc == LDAP_ALREADY_EXISTS || rc == LDAP_TYPE_OR_VALUE_EXISTS)
4380 "Unable to set the mailRoutingAddress for %s : %s",
4381 user_name, ldap_err2string(rc));
4383 p = strdup(save_argv[3]);
4385 if((c = strchr(p, ',')) != NULL)
4390 if ((c = strchr(q, '@')) == NULL)
4391 sprintf(temp, "%s@mit.edu", q);
4393 sprintf(temp, "%s", q);
4395 if(email_isvalid(temp) && State != US_DELETED)
4397 mail_routing_v[0] = temp;
4400 ADD_ATTR("mailRoutingAddress", mail_routing_v, LDAP_MOD_ADD);
4402 rc = ldap_modify_s(ldap_handle, distinguished_name, mods);
4404 if (rc == LDAP_ALREADY_EXISTS ||
4405 rc == LDAP_TYPE_OR_VALUE_EXISTS)
4410 "Unable to set the mailRoutingAddress for %s : %s",
4411 user_name, ldap_err2string(rc));
4414 while((q = strtok(NULL, ",")) != NULL) {
4417 if((c = strchr(q, '@')) == NULL)
4418 sprintf(temp, "%s@mit.edu", q);
4420 sprintf(temp, "%s", q);
4422 if(email_isvalid(temp) && State != US_DELETED)
4424 mail_routing_v[0] = temp;
4427 ADD_ATTR("mailRoutingAddress", mail_routing_v,
4430 rc = ldap_modify_s(ldap_handle, distinguished_name, mods);
4432 if (rc == LDAP_ALREADY_EXISTS ||
4433 rc == LDAP_TYPE_OR_VALUE_EXISTS)
4438 "Unable to set the mailRoutingAddress for "
4440 user_name, ldap_err2string(rc));
4446 if((c = strchr(p, '@')) == NULL)
4447 sprintf(temp, "%s@mit.edu", p);
4449 sprintf(temp, "%s", p);
4451 if(email_isvalid(temp) && State != US_DELETED)
4453 mail_routing_v[0] = temp;
4456 ADD_ATTR("mailRoutingAddress", mail_routing_v, LDAP_MOD_ADD);
4458 rc = ldap_modify_s(ldap_handle, distinguished_name, mods);
4460 if (rc == LDAP_ALREADY_EXISTS ||
4461 rc == LDAP_TYPE_OR_VALUE_EXISTS)
4466 "Unable to set the mailRoutingAddress for %s : %s",
4467 user_name, ldap_err2string(rc));
4470 } else if(rc==MR_NO_MATCH) {
4473 ADD_ATTR("mailRoutingAddress", mail_routing_v, LDAP_MOD_REPLACE);
4475 rc = ldap_modify_s(ldap_handle, distinguished_name, mods);
4477 if (rc == LDAP_ALREADY_EXISTS || rc == LDAP_TYPE_OR_VALUE_EXISTS)
4482 "Unable to set the mailRoutingAddress for %s : %s",
4483 user_name, ldap_err2string(rc));
4488 if ((strlen(MitId) != 0) && (MitId[0] == '9'))
4489 rc = attribute_update(ldap_handle, distinguished_name, MitId,
4490 "employeeID", user_name);
4492 rc = attribute_update(ldap_handle, distinguished_name, "none",
4493 "employeeID", user_name);
4496 strcat(displayName, first);
4499 if(strlen(middle)) {
4501 strcat(displayName, " ");
4503 strcat(displayName, middle);
4507 if(strlen(middle) || strlen(first))
4508 strcat(displayName, " ");
4510 strcat(displayName, last);
4513 if(strlen(displayName))
4514 rc = attribute_update(ldap_handle, distinguished_name, displayName,
4515 "displayName", user_name);
4517 rc = attribute_update(ldap_handle, distinguished_name, user_name,
4518 "displayName", user_name);
4520 if(!ActiveDirectory)
4522 if(strlen(displayName))
4523 rc = attribute_update(ldap_handle, distinguished_name, displayName,
4526 rc = attribute_update(ldap_handle, distinguished_name, user_name,
4530 if(!ActiveDirectory)
4532 rc = attribute_update(ldap_handle, distinguished_name, displayName,
4533 "eduPersonNickname", user_name);
4537 rc = attribute_update(ldap_handle, distinguished_name, first,
4538 "givenName", user_name);
4540 rc = attribute_update(ldap_handle, distinguished_name, "",
4541 "givenName", user_name);
4543 if(strlen(middle) == 1)
4544 rc = attribute_update(ldap_handle, distinguished_name, middle,
4545 "initials", user_name);
4547 rc = attribute_update(ldap_handle, distinguished_name, "",
4548 "initials", user_name);
4551 rc = attribute_update(ldap_handle, distinguished_name, last,
4554 rc = attribute_update(ldap_handle, distinguished_name, "",
4559 rc = attribute_update(ldap_handle, distinguished_name, Uid, "uid",
4564 rc = attribute_update(ldap_handle, distinguished_name, user_name, "uid",
4568 rc = attribute_update(ldap_handle, distinguished_name, MoiraId,
4569 "mitMoiraId", user_name);
4578 ADD_ATTR("uidNumber", uid_v, LDAP_MOD_REPLACE);
4582 ADD_ATTR("msSFU30UidNumber", uid_v, LDAP_MOD_REPLACE);
4587 sprintf(principal, "%s@%s", user_name, PRIMARY_REALM);
4588 sprintf(status, "%d", State);
4589 principal_v[0] = principal;
4590 loginshell_v[0] = shell;
4591 mitMoiraClass_v[0] = class;
4592 mitMoiraStatus_v[0] = status;
4594 ADD_ATTR("uidNumber", uid_v, LDAP_MOD_REPLACE);
4595 ADD_ATTR("gidNumber", gid_v, LDAP_MOD_REPLACE);
4596 ADD_ATTR("loginShell", loginshell_v, LDAP_MOD_REPLACE);
4597 ADD_ATTR("eduPersonPrincipalName", mail_v, LDAP_MOD_REPLACE);
4598 ADD_ATTR("mitMoiraClass", mitMoiraClass_v, LDAP_MOD_REPLACE);
4599 ADD_ATTR("mitMoiraStatus", mitMoiraStatus_v, LDAP_MOD_REPLACE);
4602 if ((State != US_NO_PASSWD) && (State != US_REGISTERED))
4604 userAccountControl |= UF_ACCOUNTDISABLE;
4608 hide_address_lists_v[0] = "TRUE";
4609 ADD_ATTR("msExchHideFromAddressLists", hide_address_lists_v,
4617 hide_address_lists_v[0] = NULL;
4618 address_book_v[0] = address_book;
4619 ADD_ATTR("msExchHideFromAddressLists", hide_address_lists_v,
4623 sprintf(address_book, "%s%s", GLOBAL_ADDRESS_LIST_PREFIX, dn_path);
4624 address_book_v[0] = strdup(address_book);
4625 memset(address_book, '\0', sizeof(address_book));
4626 sprintf(address_book, "%s%s", ADDRESS_LIST_PREFIX, dn_path);
4627 address_book_v[1] = strdup(address_book);
4628 memset(address_book, '\0', sizeof(address_book));
4629 sprintf(address_book, "%s%s", EMAIL_ADDRESS_LIST_PREFIX, dn_path);
4630 address_book_v[2] = strdup(address_book);
4631 memset(address_book, '\0', sizeof(address_book));
4632 sprintf(address_book, "%s%s", ALL_ADDRESS_LIST_PREFIX, dn_path);
4633 address_book_v[3] = strdup(address_book);
4634 memset(address_book, '\0', sizeof(address_book));
4636 ADD_ATTR("showInAddressBook", address_book_v,
4642 sprintf(userAccountControlStr, "%ld", userAccountControl);
4643 userAccountControl_v[0] = userAccountControlStr;
4644 ADD_ATTR("userAccountControl", userAccountControl_v, LDAP_MOD_REPLACE);
4648 if (rc = moira_connect())
4650 critical_alert(whoami, "Ldap incremental",
4651 "Error contacting Moira server : %s",
4656 argv[0] = user_name;
4658 if (!(rc = mr_query("get_pobox", 1, argv, save_query_info, save_argv)))
4660 if(!strcmp(save_argv[1], "EXCHANGE") ||
4661 (strstr(save_argv[3], search_string) != NULL))
4663 alt_recipient_v[0] = NULL;
4664 ADD_ATTR("altRecipient", alt_recipient_v, LDAP_MOD_REPLACE);
4666 argv[0] = exchange_acl;
4668 argv[2] = user_name;
4670 rc = mr_query("add_member_to_list", 3, argv, NULL, NULL);
4672 if ((rc) && (rc != MR_EXISTS))
4674 com_err(whoami, 0, "Unable to add user %s to %s: %s",
4675 user_name, exchange_acl, error_message(rc));
4678 if(!strcmp(save_argv[1], "SPLIT") ||
4679 !strcmp(save_argv[1], "SMTP")) {
4681 deliver_and_redirect_v[0] = "TRUE";
4682 alt_recipient_v[0] = alt_recipient;
4683 ADD_ATTR("altRecipient", alt_recipient_v, LDAP_MOD_REPLACE);
4684 ADD_ATTR("deliverAndRedirect", deliver_and_redirect_v,
4690 deliver_and_redirect_v[0] = "FALSE";
4691 alt_recipient_v[0] = alt_recipient;
4692 ADD_ATTR("altRecipient", alt_recipient_v, LDAP_MOD_REPLACE);
4693 ADD_ATTR("deliverAndRedirect", deliver_and_redirect_v,
4696 argv[0] = exchange_acl;
4698 argv[2] = user_name;
4700 rc = mr_query("delete_member_from_list", 3, argv, NULL, NULL);
4702 if ((rc) && (rc != MR_NO_MATCH))
4705 "Unable to remove user %s from %s: %s, %d",
4706 user_name, exchange_acl, error_message(rc), rc);
4712 deliver_and_redirect_v[0] = "FALSE";
4713 alt_recipient_v[0] = alt_recipient;
4714 ADD_ATTR("altRecipient", alt_recipient_v, LDAP_MOD_REPLACE);
4715 ADD_ATTR("deliverAndRedirect", deliver_and_redirect_v,
4718 argv[0] = exchange_acl;
4720 argv[2] = user_name;
4722 rc = mr_query("delete_member_from_list", 3, argv, NULL, NULL);
4724 if ((rc) && (rc != MR_NO_MATCH))
4727 "Unable to remove user %s from %s: %s, %d",
4728 user_name, exchange_acl, error_message(rc), rc);
4736 mail_v[0] = contact_mail;
4737 ADD_ATTR("mail", mail_v, LDAP_MOD_REPLACE);
4739 if(!ActiveDirectory)
4741 ADD_ATTR("mitMoiraMail", mail_v, LDAP_MOD_REPLACE);
4745 n = SetHomeDirectory(ldap_handle, user_name, distinguished_name, WinHomeDir,
4746 WinProfileDir, homedir_v, winProfile_v,
4747 drives_v, mods, LDAP_MOD_REPLACE, n);
4751 sprintf(filter_exp, "(sAMAccountName=%s)", "UserTemplate.u");
4752 sprintf(search_path, "%s,%s", security_template_ou, dn_path);
4753 attr_array[0] = "sAMAccountName";
4754 attr_array[1] = NULL;
4758 if ((rc = linklist_build(ldap_handle, search_path, filter_exp,
4760 &group_base, &group_count,
4761 LDAP_SCOPE_SUBTREE) != 0))
4764 if (group_count != 1)
4766 com_err(whoami, 0, "Unable to process user security template: %s - "
4767 "security not set", "UserTemplate.u");
4771 strcpy(TemplateDn, group_base->dn);
4772 strcpy(TemplateSamName, group_base->value);
4773 linklist_free(group_base);
4777 rc = ldap_search_ext_s(ldap_handle, search_path, LDAP_SCOPE_SUBTREE,
4778 filter_exp, NULL, 0, apsServerControls, NULL,
4781 if ((psMsg = ldap_first_entry(ldap_handle, psMsg)) == NULL)
4783 com_err(whoami, 0, "Unable to find user security template: %s - "
4784 "security not set", "UserTemplate.u");
4788 ppsValues = ldap_get_values_len(ldap_handle, psMsg,
4789 "ntSecurityDescriptor");
4791 if (ppsValues == NULL)
4793 com_err(whoami, 0, "Unable to find user security template: %s - "
4794 "security not set", "UserTemplate.u");
4798 ADD_ATTR("ntSecurityDescriptor", (char **)ppsValues,
4799 LDAP_MOD_REPLACE | LDAP_MOD_BVALUES);
4804 if ((rc = ldap_modify_s(ldap_handle, distinguished_name,
4805 mods)) != LDAP_SUCCESS)
4807 OldUseSFU30 = UseSFU30;
4808 SwitchSFU(mods, &UseSFU30, n);
4809 if (OldUseSFU30 != UseSFU30)
4810 rc = ldap_modify_s(ldap_handle, distinguished_name, mods);
4813 com_err(whoami, 0, "Unable to modify user data for %s : %s",
4814 user_name, ldap_err2string(rc));
4818 for (i = 0; i < n; i++)
4824 int user_rename(LDAP *ldap_handle, char *dn_path, char *before_user_name,
4832 char contact_mail[256];
4833 char proxy_address[256];
4834 char proxy_address_mit[256];
4835 char proxy_address_x500[256];
4836 char query_base_dn[256];
4838 char *userPrincipalName_v[] = {NULL, NULL};
4839 char *altSecurityIdentities_v[] = {NULL, NULL};
4840 char *name_v[] = {NULL, NULL};
4841 char *samAccountName_v[] = {NULL, NULL};
4842 char *mail_v[] = {NULL, NULL};
4843 char *mail_nickname_v[] = {NULL, NULL};
4844 char *proxy_address_v[] = {NULL, NULL, NULL, NULL};
4845 char *query_base_dn_v[] = {NULL, NULL};
4846 char *principal_v[] = {NULL, NULL};
4847 char principal[256];
4852 if (!check_string(before_user_name))
4855 "Unable to process invalid LDAP user name %s", before_user_name);
4856 return(AD_INVALID_NAME);
4859 if (!check_string(user_name))
4862 "Unable to process invalid LDAP user name %s", user_name);
4863 return(AD_INVALID_NAME);
4866 strcpy(user_name, user_name);
4869 sprintf(old_dn, "cn=%s,%s,%s", before_user_name, user_ou, dn_path);
4871 sprintf(old_dn, "uid=%s,%s,%s", before_user_name, user_ou, dn_path);
4874 sprintf(new_dn, "cn=%s", user_name);
4876 sprintf(new_dn, "uid=%s", user_name);
4878 sprintf(mail, "%s@%s", user_name, lowercase(ldap_domain));
4880 sprintf(contact_mail, "%s@exchange-forwarding.mit.edu", user_name);
4882 sprintf(contact_mail, "%s@mit.edu", user_name);
4883 sprintf(proxy_address, "smtp:%s@%s", user_name, lowercase(ldap_domain));
4884 sprintf(proxy_address_mit, "SMTP:%s@mit.edu", user_name);
4885 sprintf(proxy_address_x500, "%s/cn=%s?mit.edu", X500_PREFIX, user_name);
4887 sprintf(principal, "%s@%s", user_name, PRIMARY_REALM);
4889 if ((rc = ldap_rename_s(ldap_handle, old_dn, new_dn, NULL, TRUE,
4890 NULL, NULL)) != LDAP_SUCCESS)
4892 com_err(whoami, 0, "Unable to rename user from %s to %s : %s",
4893 before_user_name, user_name, ldap_err2string(rc));
4899 sprintf(temp, "cn=%s@exchange-forwarding.mit.edu,%s,%s", before_user_name,
4900 contact_ou, dn_path);
4902 if(rc = ldap_delete_s(ldap_handle, temp))
4904 com_err(whoami, 0, "Unable to delete user contact for %s",
4908 if(contact_create(ldap_handle, dn_path, contact_mail, contact_ou))
4910 com_err(whoami, 0, "Unable to create user contact %s", contact_mail);
4914 name_v[0] = user_name;
4915 sprintf(upn, "%s@%s", user_name, ldap_domain);
4916 userPrincipalName_v[0] = upn;
4917 principal_v[0] = principal;
4918 sprintf(temp, "Kerberos:%s@%s", user_name, PRIMARY_REALM);
4919 sprintf(query_base_dn, "%s%s", ADDRESS_LIST_PREFIX, dn_path);
4920 altSecurityIdentities_v[0] = temp;
4921 samAccountName_v[0] = user_name;
4923 mail_nickname_v[0] = user_name;
4924 proxy_address_v[0] = proxy_address_mit;
4925 proxy_address_v[1] = proxy_address;
4926 query_base_dn_v[0] = query_base_dn;
4929 ADD_ATTR("altSecurityIdentities", altSecurityIdentities_v, LDAP_MOD_REPLACE);
4930 ADD_ATTR("userPrincipalName", userPrincipalName_v, LDAP_MOD_REPLACE);
4931 ADD_ATTR("displayName", name_v, LDAP_MOD_REPLACE);
4932 ADD_ATTR("sAMAccountName", samAccountName_v, LDAP_MOD_REPLACE);
4934 if(!ActiveDirectory)
4936 ADD_ATTR("uid", samAccountName_v, LDAP_MOD_REPLACE);
4937 ADD_ATTR("eduPersonPrincipalName", mail_v, LDAP_MOD_REPLACE);
4938 ADD_ATTR("displayName", name_v, LDAP_MOD_REPLACE);
4939 ADD_ATTR("eduPersonNickname", name_v, LDAP_MOD_REPLACE);
4944 ADD_ATTR("msExchQueryBaseDN", query_base_dn_v, LDAP_MOD_REPLACE);
4945 ADD_ATTR("mailNickName", mail_nickname_v, LDAP_MOD_REPLACE);
4946 ADD_ATTR("mail", mail_v, LDAP_MOD_REPLACE);
4947 ADD_ATTR("proxyAddresses", proxy_address_v, LDAP_MOD_REPLACE);
4951 mail_v[0] = contact_mail;
4952 ADD_ATTR("mail", mail_v, LDAP_MOD_REPLACE);
4954 if(!ActiveDirectory)
4956 ADD_ATTR("mitMoiraMail", mail_v, LDAP_MOD_REPLACE);
4963 sprintf(new_dn, "cn=%s,%s,%s", user_name, user_ou, dn_path);
4965 sprintf(new_dn, "uid=%s,%s,%s", user_name, user_ou, dn_path);
4967 if ((rc = ldap_modify_s(ldap_handle, new_dn, mods)) != LDAP_SUCCESS)
4970 "Unable to modify user data for %s after renaming : %s",
4971 user_name, ldap_err2string(rc));
4974 for (i = 0; i < n; i++)
4980 int user_create(int ac, char **av, void *ptr)
4984 char user_name[256];
4988 char contact_mail[256];
4989 char proxy_address[256];
4990 char mail_nickname[256];
4991 char query_base_dn[256];
4992 char displayName[256];
4993 char address_book[1024];
4994 char alt_recipient[256];
4995 char filesys_name[256];
4996 char *cn_v[] = {NULL, NULL};
4997 char *objectClass_v[] = {"top", "person", "organizationalPerson",
4999 char *objectClass_ldap_v[] = {"top",
5000 "eduPerson", "posixAccount",
5001 "apple-user", "shadowAccount",
5002 "microsoftComTop", "securityPrincipal",
5003 "inetOrgPerson", "user",
5004 "organizationalPerson", "person",
5005 "mailRecipient", NULL};
5007 char *samAccountName_v[] = {NULL, NULL};
5008 char *altSecurityIdentities_v[] = {NULL, NULL};
5009 char *mitMoiraId_v[] = {NULL, NULL};
5010 char *mitMoiraClass_v[] = {NULL, NULL};
5011 char *mitMoiraStatus_v[] = {NULL, NULL};
5012 char *name_v[] = {NULL, NULL};
5013 char *desc_v[] = {NULL, NULL};
5014 char *userPrincipalName_v[] = {NULL, NULL};
5015 char *userAccountControl_v[] = {NULL, NULL};
5016 char *uid_v[] = {NULL, NULL};
5017 char *gid_v[] = {NULL, NULL};
5018 char *mitid_v[] = {NULL, NULL};
5019 char *homedir_v[] = {NULL, NULL};
5020 char *winProfile_v[] = {NULL, NULL};
5021 char *drives_v[] = {NULL, NULL};
5022 char *mail_v[] = {NULL, NULL};
5023 char *givenName_v[] = {NULL, NULL};
5024 char *sn_v[] = {NULL, NULL};
5025 char *initials_v[] = {NULL, NULL};
5026 char *displayName_v[] = {NULL, NULL};
5027 char *proxy_address_v[] = {NULL, NULL};
5028 char *mail_nickname_v[] = {NULL, NULL};
5029 char *query_base_dn_v[] = {NULL, NULL};
5030 char *address_book_v[] = {NULL, NULL, NULL, NULL, NULL};
5031 char *homeMDB_v[] = {NULL, NULL};
5032 char *homeServerName_v[] = {NULL, NULL};
5033 char *mdbUseDefaults_v[] = {NULL, NULL};
5034 char *mailbox_guid_v[] = {NULL, NULL};
5035 char *user_culture_v[] = {NULL, NULL};
5036 char *user_account_control_v[] = {NULL, NULL};
5037 char *msexch_version_v[] = {NULL, NULL};
5038 char *alt_recipient_v[] = {NULL, NULL};
5039 char *hide_address_lists_v[] = {NULL, NULL};
5040 char *principal_v[] = {NULL, NULL};
5041 char *loginshell_v[] = {NULL, NULL};
5042 char userAccountControlStr[80];
5044 char principal[256];
5045 char filter_exp[1024];
5046 char search_path[512];
5047 char *attr_array[3];
5048 u_int userAccountControl = UF_NORMAL_ACCOUNT | UF_DONT_EXPIRE_PASSWD |
5049 UF_PASSWD_CANT_CHANGE;
5055 char WinHomeDir[1024];
5056 char WinProfileDir[1024];
5058 char *homeServerName;
5060 char acBERBuf[N_SD_BER_BYTES];
5061 LK_ENTRY *group_base;
5063 char TemplateDn[512];
5064 char TemplateSamName[128];
5065 LDAP_BERVAL **ppsValues;
5066 LDAPControl sControl = {"1.2.840.113556.1.4.801",
5067 { N_SD_BER_BYTES, acBERBuf },
5069 LDAPControl *apsServerControls[] = {&sControl, NULL};
5073 char search_string[256];
5074 char *o_v[] = {NULL, NULL};
5076 char *mail_routing_v[] = {NULL, NULL};
5077 char *mail_alternate_v[] = {NULL, NULL};
5078 char *mit_moira_imap_address_v[] = {NULL, NULL};
5079 char *deliver_and_redirect_v[] = {NULL, NULL};
5084 dwInfo = OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION |
5085 DACL_SECURITY_INFORMATION | SACL_SECURITY_INFORMATION;
5086 BEREncodeSecurityBits(dwInfo, acBERBuf);
5088 if (!check_string(av[U_NAME]))
5090 callback_rc = AD_INVALID_NAME;
5091 com_err(whoami, 0, "Unable to process invalid LDAP user name %s",
5093 return(AD_INVALID_NAME);
5096 memset(WinHomeDir, '\0', sizeof(WinHomeDir));
5097 memset(WinProfileDir, '\0', sizeof(WinProfileDir));
5098 memset(displayName, '\0', sizeof(displayName));
5099 memset(query_base_dn, '\0', sizeof(query_base_dn));
5100 memset(filesys_name, '\0', sizeof(filesys_name));
5101 strcpy(WinHomeDir, av[U_WINHOMEDIR]);
5102 strcpy(WinProfileDir, av[U_WINPROFILEDIR]);
5103 strcpy(user_name, av[U_NAME]);
5104 sprintf(upn, "%s@%s", user_name, ldap_domain);
5105 sprintf(sam_name, "%s", av[U_NAME]);
5106 sprintf(filesys_name, "%s.po", user_name);
5108 if(strlen(av[U_FIRST])) {
5109 strcat(displayName, av[U_FIRST]);
5112 if(strlen(av[U_MIDDLE])) {
5113 if(strlen(av[U_FIRST]))
5114 strcat(displayName, " ");
5116 strcat(displayName, av[U_MIDDLE]);
5119 if(strlen(av[U_LAST])) {
5120 if(strlen(av[U_FIRST]) || strlen(av[U_MIDDLE]))
5121 strcat(displayName, " ");
5123 strcat(displayName, av[U_LAST]);
5126 samAccountName_v[0] = sam_name;
5128 if ((atoi(av[U_STATE]) != US_NO_PASSWD) &&
5129 (atoi(av[U_STATE]) != US_REGISTERED))
5131 userAccountControl |= UF_ACCOUNTDISABLE;
5134 sprintf(userAccountControlStr, "%ld", userAccountControl);
5135 userAccountControl_v[0] = userAccountControlStr;
5136 userPrincipalName_v[0] = upn;
5139 cn_v[0] = user_name;
5141 cn_v[0] = displayName;
5143 name_v[0] = user_name;
5144 desc_v[0] = "Auto account created by Moira";
5146 givenName_v[0] = av[U_FIRST];
5149 sn_v[0] = av[U_LAST];
5151 if(strlen(av[U_LAST]))
5152 sn_v[0] = av[U_LAST];
5154 sn_v[0] = av[U_NAME];
5156 displayName_v[0] = displayName;
5157 mail_nickname_v[0] = user_name;
5158 o_v[0] = "Massachusetts Institute of Technology";
5160 sprintf(temp, "Kerberos:%s@%s", user_name, PRIMARY_REALM);
5161 sprintf(principal, "%s@%s", user_name, PRIMARY_REALM);
5162 altSecurityIdentities_v[0] = temp;
5163 principal_v[0] = principal;
5166 sprintf(new_dn, "cn=%s,%s,%s", user_name, user_ou, call_args[1]);
5168 sprintf(new_dn, "uid=%s,%s,%s", user_name, user_ou, call_args[1]);
5170 sprintf(mail,"%s@%s", user_name, lowercase(ldap_domain));
5172 sprintf(contact_mail, "%s@exchange-forwarding.mit.edu", user_name);
5174 sprintf(contact_mail, "%s@mit.edu", user_name);
5175 sprintf(query_base_dn, "%s%s", ADDRESS_LIST_PREFIX, call_args[1]);
5176 query_base_dn_v[0] = query_base_dn;
5177 sprintf(alt_recipient, "cn=%s@exchange-forwarding.mit.edu,%s,%s", user_name,
5178 contact_ou, call_args[1]);
5179 sprintf(search_string, "@%s", uppercase(ldap_domain));
5183 if(contact_create((LDAP *)call_args[0], call_args[1], contact_mail,
5186 com_err(whoami, 0, "Unable to create user contact %s",
5190 if(find_homeMDB((LDAP *)call_args[0], call_args[1], &homeMDB,
5193 com_err(whoami, 0, "Unable to locate homeMB and homeServerName");
5197 com_err(whoami, 0, "homeMDB:%s", homeMDB);
5198 com_err(whoami, 0, "homeServerName:%s", homeServerName);
5200 homeMDB_v[0] = homeMDB;
5201 homeServerName_v[0] = homeServerName;
5206 ADD_ATTR("cn", cn_v, LDAP_MOD_ADD);
5210 ADD_ATTR("objectClass", objectClass_v, LDAP_MOD_ADD);
5214 ADD_ATTR("objectClass", objectClass_ldap_v, LDAP_MOD_ADD);
5217 ADD_ATTR("sAMAccountName", samAccountName_v, LDAP_MOD_ADD);
5218 ADD_ATTR("userPrincipalName", userPrincipalName_v, LDAP_MOD_ADD);
5219 ADD_ATTR("userAccountControl", userAccountControl_v, LDAP_MOD_ADD);
5220 ADD_ATTR("name", name_v, LDAP_MOD_ADD);
5221 ADD_ATTR("description", desc_v, LDAP_MOD_ADD);
5225 if ((atoi(av[U_STATE]) != US_NO_PASSWD) &&
5226 (atoi(av[U_STATE]) != US_REGISTERED))
5228 hide_address_lists_v[0] = "TRUE";
5229 ADD_ATTR("msExchHideFromAddressLists", hide_address_lists_v,
5234 hide_address_lists_v[0] = "FALSE";
5235 ADD_ATTR("msExchHideFromAddressLists", hide_address_lists_v,
5239 ADD_ATTR("msExchQueryBaseDN", query_base_dn_v, LDAP_MOD_ADD);
5240 ADD_ATTR("mailNickName", mail_nickname_v, LDAP_MOD_ADD);
5241 ADD_ATTR("homeMDB", homeMDB_v, LDAP_MOD_ADD);
5242 mdbUseDefaults_v[0] = "TRUE";
5243 ADD_ATTR("mdbUseDefaults", mdbUseDefaults_v, LDAP_MOD_ADD);
5244 ADD_ATTR("msExchHomeServerName", homeServerName_v, LDAP_MOD_ADD);
5246 argv[0] = user_name;
5248 if (!(rc = mr_query("get_pobox", 1, argv, save_query_info, save_argv)))
5250 if(!strcmp(save_argv[1], "EXCHANGE") ||
5251 (strstr(save_argv[3], search_string) != NULL))
5253 argv[0] = exchange_acl;
5255 argv[2] = user_name;
5257 rc = mr_query("add_member_to_list", 3, argv, NULL, NULL);
5259 if ((rc) && (rc != MR_EXISTS))
5261 com_err(whoami, 0, "Unable to add user %s to %s: %s",
5262 user_name, exchange_acl, error_message(rc));
5265 if(!strcmp(save_argv[1], "SPLIT") ||
5266 !strcmp(save_argv[1], "SMTP")) {
5268 deliver_and_redirect_v[0] = "TRUE";
5269 alt_recipient_v[0] = alt_recipient;
5271 ADD_ATTR("altRecipient", alt_recipient_v, LDAP_MOD_ADD);
5272 ADD_ATTR("deliverAndRedirect", deliver_and_redirect_v,
5278 alt_recipient_v[0] = alt_recipient;
5279 ADD_ATTR("altRecipient", alt_recipient_v, LDAP_MOD_ADD);
5284 alt_recipient_v[0] = alt_recipient;
5285 ADD_ATTR("altRecipient", alt_recipient_v, LDAP_MOD_ADD);
5287 com_err(whoami, 0, "Unable to fetch pobox for %s", user_name);
5292 mail_v[0] = contact_mail;
5293 ADD_ATTR("mail", mail_v, LDAP_MOD_ADD);
5295 if(!ActiveDirectory)
5297 ADD_ATTR("mitMoiraMail", mail_v, LDAP_MOD_ADD);
5301 if(strlen(av[U_FIRST])) {
5302 ADD_ATTR("givenName", givenName_v, LDAP_MOD_ADD);
5305 if(strlen(av[U_LAST]) || strlen(av[U_NAME])) {
5306 ADD_ATTR("sn", sn_v, LDAP_MOD_ADD);
5309 if(strlen(av[U_FIRST]) || strlen(av[U_MIDDLE]) || strlen(av[U_LAST])) {
5310 ADD_ATTR("displayName", displayName_v, LDAP_MOD_ADD);
5312 if(!ActiveDirectory)
5314 ADD_ATTR("eduPersonNickname", displayName_v, LDAP_MOD_ADD);
5317 ADD_ATTR("displayName", name_v, LDAP_MOD_ADD);
5319 if(!ActiveDirectory)
5321 ADD_ATTR("eduPersonNickname", name_v, LDAP_MOD_ADD);
5325 if (strlen(av[U_MIDDLE]) == 1) {
5326 initials_v[0] = av[U_MIDDLE];
5327 ADD_ATTR("initials", initials_v, LDAP_MOD_ADD);
5330 if (strlen(call_args[2]) != 0)
5332 mitMoiraId_v[0] = call_args[2];
5333 ADD_ATTR("mitMoiraId", mitMoiraId_v, LDAP_MOD_ADD);
5336 ADD_ATTR("altSecurityIdentities", altSecurityIdentities_v, LDAP_MOD_ADD);
5338 if(!ActiveDirectory)
5340 loginshell_v[0] = av[U_SHELL];
5341 mitMoiraClass_v[0] = av[U_CLASS];
5342 mitMoiraStatus_v[0] = av[U_STATE];
5343 ADD_ATTR("loginShell", loginshell_v, LDAP_MOD_ADD);
5344 ADD_ATTR("uid", samAccountName_v, LDAP_MOD_ADD);
5345 ADD_ATTR("eduPersonPrincipalName", mail_v, LDAP_MOD_ADD);
5346 ADD_ATTR("o", o_v, LDAP_MOD_ADD);
5347 ADD_ATTR("mitMoiraClass", mitMoiraClass_v, LDAP_MOD_ADD);
5348 ADD_ATTR("mitMoiraStatus", mitMoiraStatus_v, LDAP_MOD_ADD);
5351 if (strlen(av[U_UID]) != 0)
5353 uid_v[0] = av[U_UID];
5357 ADD_ATTR("uid", uid_v, LDAP_MOD_ADD);
5362 ADD_ATTR("uidNumber", uid_v, LDAP_MOD_ADD);
5363 ADD_ATTR("gidNumber", gid_v, LDAP_MOD_ADD);
5370 ADD_ATTR("uidNumber", uid_v, LDAP_MOD_ADD);
5374 ADD_ATTR("msSFU30UidNumber", uid_v, LDAP_MOD_ADD);
5379 if ((strlen(av[U_MITID]) != 0) && (av[U_MITID][0] == '9'))
5380 mitid_v[0] = av[U_MITID];
5382 mitid_v[0] = "none";
5384 ADD_ATTR("employeeID", mitid_v, LDAP_MOD_ADD);
5386 n = SetHomeDirectory((LDAP *)call_args[0], user_name, new_dn,
5387 WinHomeDir, WinProfileDir, homedir_v, winProfile_v,
5388 drives_v, mods, LDAP_MOD_ADD, n);
5392 sprintf(filter_exp, "(sAMAccountName=%s)", "UserTemplate.u");
5393 sprintf(search_path, "%s,%s", security_template_ou, call_args[1]);
5394 attr_array[0] = "sAMAccountName";
5395 attr_array[1] = NULL;
5399 if ((rc = linklist_build((LDAP *)call_args[0], search_path, filter_exp,
5400 attr_array, &group_base, &group_count,
5401 LDAP_SCOPE_SUBTREE) != 0))
5404 if (group_count != 1)
5406 com_err(whoami, 0, "Unable to process user security template: %s - "
5407 "security not set", "UserTemplate.u");
5411 strcpy(TemplateDn, group_base->dn);
5412 strcpy(TemplateSamName, group_base->value);
5413 linklist_free(group_base);
5417 rc = ldap_search_ext_s((LDAP *)call_args[0], search_path,
5418 LDAP_SCOPE_SUBTREE, filter_exp, NULL, 0,
5419 apsServerControls, NULL,
5422 if ((psMsg = ldap_first_entry((LDAP *)call_args[0], psMsg)) == NULL)
5424 com_err(whoami, 0, "Unable to find user security template: %s - "
5425 "security not set", "UserTemplate.u");
5429 ppsValues = ldap_get_values_len((LDAP *)call_args[0], psMsg,
5430 "ntSecurityDescriptor");
5431 if (ppsValues == NULL)
5433 com_err(whoami, 0, "Unable to find user security template: %s - "
5434 "security not set", "UserTemplate.u");
5438 ADD_ATTR("ntSecurityDescriptor", (char **)ppsValues,
5439 LDAP_MOD_REPLACE | LDAP_MOD_BVALUES);
5444 rc = ldap_add_ext_s((LDAP *)call_args[0], new_dn, mods, NULL, NULL);
5446 if ((rc != LDAP_SUCCESS) && (rc != LDAP_ALREADY_EXISTS))
5448 OldUseSFU30 = UseSFU30;
5449 SwitchSFU(mods, &UseSFU30, n);
5450 if (OldUseSFU30 != UseSFU30)
5451 rc = ldap_add_ext_s((LDAP *)call_args[0], new_dn, mods, NULL, NULL);
5454 for (i = 0; i < n; i++)
5457 if ((rc != LDAP_SUCCESS) && (rc != LDAP_ALREADY_EXISTS))
5459 com_err(whoami, 0, "Unable to create user %s : %s",
5460 user_name, ldap_err2string(rc));
5465 if ((rc == LDAP_SUCCESS) && (SetPassword))
5467 if ((rc = set_password(sam_name, "", ldap_domain)) != 0)
5469 ad_kdc_disconnect();
5470 if (!ad_server_connect(default_server, ldap_domain))
5472 com_err(whoami, 0, "Unable to set password for user %s : %s",
5474 "cannot get changepw ticket from windows domain");
5478 if ((rc = set_password(sam_name, "", ldap_domain)) != 0)
5480 com_err(whoami, 0, "Unable to set password for user %s "
5481 ": %ld", user_name, rc);
5487 if(!ActiveDirectory)
5489 if (rc = moira_connect())
5491 critical_alert(whoami, "Ldap incremental",
5492 "Error contacting Moira server : %s",
5497 argv[0] = filesys_name;
5499 if (!(rc = mr_query("get_filesys_by_label", 1, argv, save_query_info,
5503 ADD_ATTR("mitMoiraIMAPAddress", mit_moira_imap_address_v,
5506 rc = ldap_modify_s((LDAP *)call_args[0], new_dn, mods);
5508 if (rc == LDAP_ALREADY_EXISTS || rc == LDAP_TYPE_OR_VALUE_EXISTS)
5513 "Unable to set the mitMoiraIMAPAddress for %s : %s",
5514 user_name, ldap_err2string(rc));
5516 sprintf(temp, "%s@%s", user_name, save_argv[FS_MACHINE]);
5518 mit_moira_imap_address_v[0] = temp;
5521 ADD_ATTR("mitMoiraIMAPAddress", mit_moira_imap_address_v,
5524 rc = ldap_modify_s((LDAP *)call_args[0], new_dn, mods);
5526 if (rc == LDAP_ALREADY_EXISTS || rc == LDAP_TYPE_OR_VALUE_EXISTS)
5530 com_err(whoami, 0, "Unable to set the mitMoiraIMAPAddress for "
5531 "%s : %s", user_name, ldap_err2string(rc));
5532 } else if(rc==MR_NO_MATCH) {
5535 ADD_ATTR("mitMoiraIMAPAddress", mit_moira_imap_address_v,
5538 rc = ldap_modify_s((LDAP *)call_args[0], new_dn, mods);
5540 if (rc == LDAP_ALREADY_EXISTS || rc == LDAP_TYPE_OR_VALUE_EXISTS)
5545 "Unable to set the mitMoiraIMAPAddress for %s : %s",
5546 user_name, ldap_err2string(rc));
5550 argv[0] = user_name;
5552 if (!(rc = mr_query("get_pobox", 1, argv, save_query_info, save_argv)))
5555 ADD_ATTR("mailRoutingAddress", mail_routing_v, LDAP_MOD_REPLACE);
5557 rc = ldap_modify_s((LDAP *)call_args[0], new_dn, mods);
5559 if (rc == LDAP_ALREADY_EXISTS || rc == LDAP_TYPE_OR_VALUE_EXISTS)
5564 "Unable to set the mailRoutingAddress for %s : %s",
5565 user_name, ldap_err2string(rc));
5567 p = strdup(save_argv[3]);
5569 if((c = strchr(p, ',')) != NULL) {
5573 if ((c = strchr(q, '@')) == NULL)
5574 sprintf(temp, "%s@mit.edu", q);
5576 sprintf(temp, "%s", q);
5578 if(email_isvalid(temp) && atoi(av[U_STATE]) != US_DELETED)
5580 mail_routing_v[0] = temp;
5583 ADD_ATTR("mailRoutingAddress", mail_routing_v, LDAP_MOD_ADD);
5585 rc = ldap_modify_s((LDAP *)call_args[0], new_dn, mods);
5587 if (rc == LDAP_ALREADY_EXISTS ||
5588 rc == LDAP_TYPE_OR_VALUE_EXISTS)
5593 "Unable to set the mailRoutingAddress for %s : %s",
5594 user_name, ldap_err2string(rc));
5597 while((q = strtok(NULL, ",")) != NULL) {
5600 if((c = strchr(q, '@')) == NULL)
5601 sprintf(temp, "%s@mit.edu", q);
5603 sprintf(temp, "%s", q);
5605 if(email_isvalid(temp) && atoi(av[U_STATE]) != US_DELETED)
5607 mail_routing_v[0] = temp;
5610 ADD_ATTR("mailRoutingAddress", mail_routing_v, LDAP_MOD_ADD);
5612 rc = ldap_modify_s((LDAP *)call_args[0], new_dn, mods);
5614 if (rc == LDAP_ALREADY_EXISTS ||
5615 rc == LDAP_TYPE_OR_VALUE_EXISTS)
5620 "Unable to set the mailRoutingAddress for %s : %s",
5621 user_name, ldap_err2string(rc));
5627 if((c = strchr(p, '@')) == NULL)
5628 sprintf(temp, "%s@mit.edu", p);
5630 sprintf(temp, "%s", p);
5632 if(email_isvalid(temp) && atoi(av[U_STATE]) != US_DELETED)
5634 mail_routing_v[0] = temp;
5637 ADD_ATTR("mailRoutingAddress", mail_routing_v, LDAP_MOD_ADD);
5639 rc = ldap_modify_s((LDAP *)call_args[0], new_dn, mods);
5641 if (rc == LDAP_ALREADY_EXISTS ||
5642 rc == LDAP_TYPE_OR_VALUE_EXISTS)
5647 "Unable to set the mailRoutingAddress for %s : %s",
5648 user_name, ldap_err2string(rc));
5658 int user_change_status(LDAP *ldap_handle, char *dn_path,
5659 char *user_name, char *MoiraId,
5663 char *attr_array[3];
5665 char distinguished_name[1024];
5667 char *mitMoiraId_v[] = {NULL, NULL};
5669 LK_ENTRY *group_base;
5676 if (!check_string(user_name))
5678 com_err(whoami, 0, "Unable to process invalid LDAP user name %s",
5680 return(AD_INVALID_NAME);
5686 if (strlen(MoiraId) != 0)
5688 sprintf(filter, "(&(objectClass=user)(mitMoiraId=%s))", MoiraId);
5689 attr_array[0] = "UserAccountControl";
5690 attr_array[1] = NULL;
5691 if ((rc = linklist_build(ldap_handle, dn_path, filter, attr_array,
5692 &group_base, &group_count,
5693 LDAP_SCOPE_SUBTREE)) != 0)
5695 com_err(whoami, 0, "Unable to process user %s : %s",
5696 user_name, ldap_err2string(rc));
5701 if (group_count != 1)
5703 linklist_free(group_base);
5706 sprintf(filter, "(sAMAccountName=%s)", user_name);
5707 attr_array[0] = "UserAccountControl";
5708 attr_array[1] = NULL;
5709 if ((rc = linklist_build(ldap_handle, dn_path, filter, attr_array,
5710 &group_base, &group_count,
5711 LDAP_SCOPE_SUBTREE)) != 0)
5713 com_err(whoami, 0, "Unable to process user %s : %s",
5714 user_name, ldap_err2string(rc));
5719 if (group_count != 1)
5721 linklist_free(group_base);
5722 com_err(whoami, 0, "Unable to find user %s in directory",
5724 return(LDAP_NO_SUCH_OBJECT);
5727 strcpy(distinguished_name, group_base->dn);
5728 ulongValue = atoi((*group_base).value);
5730 if (operation == MEMBER_DEACTIVATE)
5731 ulongValue |= UF_ACCOUNTDISABLE;
5733 ulongValue &= ~UF_ACCOUNTDISABLE;
5735 sprintf(temp, "%ld", ulongValue);
5737 if ((rc = construct_newvalues(group_base, group_count, (*group_base).value,
5738 temp, &modvalues, REPLACE)) == 1)
5741 linklist_free(group_base);
5745 ADD_ATTR("UserAccountControl", modvalues, LDAP_MOD_REPLACE);
5747 if (strlen(MoiraId) != 0)
5749 mitMoiraId_v[0] = MoiraId;
5750 ADD_ATTR("mitMoiraId", mitMoiraId_v, LDAP_MOD_REPLACE);
5754 rc = ldap_modify_s(ldap_handle, distinguished_name, mods);
5756 for (i = 0; i < n; i++)
5759 free_values(modvalues);
5761 if (rc != LDAP_SUCCESS)
5763 com_err(whoami, 0, "Unable to change status of user %s : %s",
5764 user_name, ldap_err2string(rc));
5771 int user_delete(LDAP *ldap_handle, char *dn_path,
5772 char *u_name, char *MoiraId)
5775 char *attr_array[3];
5776 char distinguished_name[1024];
5777 char user_name[512];
5778 LK_ENTRY *group_base;
5783 if (!check_string(u_name))
5784 return(AD_INVALID_NAME);
5786 strcpy(user_name, u_name);
5790 if (strlen(MoiraId) != 0)
5792 sprintf(filter, "(&(objectClass=user)(mitMoiraId=%s))", MoiraId);
5793 attr_array[0] = "name";
5794 attr_array[1] = NULL;
5795 if ((rc = linklist_build(ldap_handle, dn_path, filter, attr_array,
5796 &group_base, &group_count,
5797 LDAP_SCOPE_SUBTREE)) != 0)
5799 com_err(whoami, 0, "Unable to process user %s : %s",
5800 user_name, ldap_err2string(rc));
5805 if (group_count != 1)
5807 linklist_free(group_base);
5810 sprintf(filter, "(sAMAccountName=%s)", user_name);
5811 attr_array[0] = "name";
5812 attr_array[1] = NULL;
5813 if ((rc = linklist_build(ldap_handle, dn_path, filter, attr_array,
5814 &group_base, &group_count,
5815 LDAP_SCOPE_SUBTREE)) != 0)
5817 com_err(whoami, 0, "Unable to process user %s : %s",
5818 user_name, ldap_err2string(rc));
5823 if (group_count != 1)
5828 strcpy(distinguished_name, group_base->dn);
5830 if (rc = ldap_delete_s(ldap_handle, distinguished_name))
5832 com_err(whoami, 0, "Unable to process user %s : %s",
5833 user_name, ldap_err2string(rc));
5836 /* Need to add code to delete mit.edu contact */
5840 sprintf(temp, "cn=%s@exchange-forwarding.mit.edu,%s,%s", user_name,
5841 contact_ou, dn_path);
5843 if(rc = ldap_delete_s(ldap_handle, temp))
5845 com_err(whoami, 0, "Unable to delete user contact for %s",
5851 linklist_free(group_base);
5856 void linklist_free(LK_ENTRY *linklist_base)
5858 LK_ENTRY *linklist_previous;
5860 while (linklist_base != NULL)
5862 if (linklist_base->dn != NULL)
5863 free(linklist_base->dn);
5865 if (linklist_base->attribute != NULL)
5866 free(linklist_base->attribute);
5868 if (linklist_base->value != NULL)
5869 free(linklist_base->value);
5871 if (linklist_base->member != NULL)
5872 free(linklist_base->member);
5874 if (linklist_base->type != NULL)
5875 free(linklist_base->type);
5877 if (linklist_base->list != NULL)
5878 free(linklist_base->list);
5880 linklist_previous = linklist_base;
5881 linklist_base = linklist_previous->next;
5882 free(linklist_previous);
5886 void free_values(char **modvalues)
5892 if (modvalues != NULL)
5894 while (modvalues[i] != NULL)
5897 modvalues[i] = NULL;
5904 static int illegalchars[] = {
5905 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* ^@ - ^O */
5906 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* ^P - ^_ */
5907 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, /* SPACE - / */
5908 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, /* 0 - ? */
5909 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* @ - O */
5910 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, /* P - _ */
5911 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* ` - o */
5912 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, /* p - ^? */
5913 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
5914 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
5915 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
5916 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
5917 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
5918 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
5919 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
5920 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
5923 static int illegalchars_ldap[] = {
5924 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* ^@ - ^O */
5925 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* ^P - ^_ */
5926 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, /* SPACE - / */
5927 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, /* 0 - ? */
5928 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* @ - O */
5929 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, /* P - _ */
5930 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* ` - o */
5931 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, /* p - ^? */
5932 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
5933 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
5934 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
5935 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
5936 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
5937 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
5938 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
5939 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
5942 int check_string(char *s)
5953 if (isupper(character))
5954 character = tolower(character);
5958 if (illegalchars[(unsigned) character])
5960 com_err(whoami, 0, "Found illegal char '%c' (%d) in string %s",
5961 character, (unsigned) character, string);
5967 if (illegalchars_ldap[(unsigned) character])
5969 com_err(whoami, 0, "Found illegal char '%c' (%d) in string %s",
5970 character, (unsigned) character, string);
5979 int check_container_name(char *s)
5987 if (isupper(character))
5988 character = tolower(character);
5990 if (character == ' ')
5993 if (illegalchars[(unsigned) character])
6000 int mr_connect_cl(char *server, char *client, int version, int auth)
6006 status = mr_connect(server);
6010 com_err(whoami, status, "while connecting to Moira");
6014 status = mr_motd(&motd);
6019 com_err(whoami, status, "while checking server status");
6025 sprintf(temp, "The Moira server is currently unavailable: %s", motd);
6026 com_err(whoami, status, temp);
6031 status = mr_version(version);
6035 if (status == MR_UNKNOWN_PROC)
6038 status = MR_VERSION_HIGH;
6040 status = MR_SUCCESS;
6043 if (status == MR_VERSION_HIGH)
6045 com_err(whoami, 0, "Warning: This client is running newer code "
6046 "than the server.");
6047 com_err(whoami, 0, "Some operations may not work.");
6049 else if (status && status != MR_VERSION_LOW)
6051 com_err(whoami, status, "while setting query version number.");
6059 status = mr_krb5_auth(client);
6062 com_err(whoami, status, "while authenticating to Moira.");
6071 void AfsToWinAfs(char* path, char* winPath)
6075 strcpy(winPath, WINAFS);
6076 pathPtr = path + strlen(AFS);
6077 winPathPtr = winPath + strlen(WINAFS);
6081 if (*pathPtr == '/')
6084 *winPathPtr = *pathPtr;
6091 int GetAceInfo(int ac, char **av, void *ptr)
6098 strcpy(call_args[0], av[L_ACE_TYPE]);
6099 strcpy(call_args[1], av[L_ACE_NAME]);
6101 get_group_membership(call_args[2], call_args[3], &security_flag, av);
6102 return(LDAP_SUCCESS);
6105 int checkADname(LDAP *ldap_handle, char *dn_path, char *Name)
6108 char *attr_array[3];
6111 LK_ENTRY *group_base;
6116 sprintf(filter, "(sAMAccountName=%s)", Name);
6117 attr_array[0] = "sAMAccountName";
6118 attr_array[1] = NULL;
6120 if ((rc = linklist_build(ldap_handle, dn_path, filter, attr_array,
6121 &group_base, &group_count,
6122 LDAP_SCOPE_SUBTREE)) != 0)
6124 com_err(whoami, 0, "Unable to process ACE name %s : %s",
6125 Name, ldap_err2string(rc));
6129 linklist_free(group_base);
6132 if (group_count == 0)
6140 int ProcessAce(LDAP *ldap_handle, char *dn_path, char *Name, char *Type,
6141 int UpdateGroup, int *ProcessGroup, char *maillist,
6145 char GroupName[256];
6151 char AceMembership[2];
6154 char *save_argv[U_END];
6158 com_err(whoami, 0, "ProcessAce disabled, skipping");
6162 strcpy(GroupName, Name);
6164 if (strcasecmp(Type, "LIST"))
6170 AceInfo[0] = AceType;
6171 AceInfo[1] = AceName;
6172 AceInfo[2] = AceMembership;
6174 memset(AceType, '\0', sizeof(AceType));
6175 memset(AceName, '\0', sizeof(AceName));
6176 memset(AceMembership, '\0', sizeof(AceMembership));
6177 memset(AceOu, '\0', sizeof(AceOu));
6180 if (rc = mr_query("get_list_info", 1, av, GetAceInfo, AceInfo))
6182 if(rc != MR_NO_MATCH)
6183 com_err(whoami, 0, "Unable to get ACE info for list %s : %s",
6184 GroupName, error_message(rc));
6191 com_err(whoami, 0, "Unable to get ACE info for list %s", GroupName);
6195 if ((strcasecmp(AceType, "USER")) && (strcasecmp(AceType, "LIST")))
6198 strcpy(temp, AceName);
6200 if (!strcasecmp(AceType, "LIST"))
6201 sprintf(temp, "%s%s", AceName, group_suffix);
6205 if (checkADname(ldap_handle, dn_path, temp))
6208 (*ProcessGroup) = 1;
6211 if (!strcasecmp(AceInfo[0], "LIST"))
6213 if (make_new_group(ldap_handle, dn_path, "", AceName, AceOu,
6214 AceMembership, 0, UpdateGroup, maillist,
6218 populate_group(ldap_handle, dn_path, AceName, AceOu, AceMembership,
6221 else if (!strcasecmp(AceInfo[0], "USER"))
6224 call_args[0] = (char *)ldap_handle;
6225 call_args[1] = dn_path;
6227 call_args[3] = NULL;
6230 if(!strcasecmp(AceName, PRODUCTION_PRINCIPAL) ||
6231 !strcasecmp(AceName, TEST_PRINCIPAL))
6236 if (rc = mr_query("get_user_account_by_login", 1, av,
6237 save_query_info, save_argv))
6239 com_err(whoami, 0, "Unable to process user ACE %s for group %s.",
6244 if (rc = user_create(U_END, save_argv, call_args))
6246 com_err(whoami, 0, "Unable to process user ACE %s for group %s.",
6253 com_err(whoami, 0, "Unable to process user Ace %s for group %s",
6263 if (!strcasecmp(AceType, "LIST"))
6265 if (!strcasecmp(GroupName, AceName))
6269 strcpy(GroupName, AceName);
6275 int make_new_group(LDAP *ldap_handle, char *dn_path, char *MoiraId,
6276 char *group_name, char *group_ou, char *group_membership,
6277 int group_security_flag, int updateGroup, char *maillist,
6283 LK_ENTRY *group_base;
6286 char *attr_array[3];
6289 call_args[0] = (char *)ldap_handle;
6290 call_args[1] = dn_path;
6291 call_args[2] = group_name;
6292 call_args[3] = (char *)(MOIRA_USERS | MOIRA_KERBEROS | MOIRA_STRINGS);
6293 call_args[4] = (char *)updateGroup;
6294 call_args[5] = MoiraId;
6296 call_args[7] = NULL;
6302 if (rc = mr_query("get_list_info", 1, av, group_create, call_args))
6305 com_err(whoami, 0, "Unable to create list %s : %s", group_name,
6313 com_err(whoami, 0, "Unable to create list %s", group_name);
6314 return(callback_rc);
6320 int populate_group(LDAP *ldap_handle, char *dn_path, char *group_name,
6321 char *group_ou, char *group_membership,
6322 int group_security_flag, char *MoiraId,
6338 char *member_v[] = {NULL, NULL};
6339 char *save_argv[U_END];
6340 char machine_ou[256];
6341 char NewMachineName[1024];
6343 com_err(whoami, 0, "Populating group %s", group_name);
6345 call_args[0] = (char *)ldap_handle;
6346 call_args[1] = dn_path;
6347 call_args[2] = group_name;
6348 call_args[3] = (char *)(MOIRA_USERS | MOIRA_KERBEROS | MOIRA_STRINGS |
6350 call_args[4] = NULL;
6354 if (rc = mr_query("get_end_members_of_list", 1, av,
6355 member_list_build, call_args))
6360 com_err(whoami, 0, "Unable to populate list %s : %s",
6361 group_name, error_message(rc));
6365 if (member_base != NULL)
6371 if (!strcasecmp(ptr->type, "LIST"))
6377 if (!strcasecmp(ptr->type, "MACHINE") && !ProcessMachineContainer)
6383 if(!strcasecmp(ptr->type, "USER"))
6385 if(!strcasecmp(ptr->member, PRODUCTION_PRINCIPAL) ||
6386 !strcasecmp(ptr->member, TEST_PRINCIPAL))
6398 if(max_group_members && !synchronize && (group_members > max_group_members))
6401 "Group %s membership of %d exceeds maximum %d, skipping",
6402 group_name, group_members, max_group_members);
6406 members = (char **)malloc(sizeof(char *) * 2);
6408 if (member_base != NULL)
6414 if (!strcasecmp(ptr->type, "LIST"))
6420 if (!strcasecmp(ptr->type, "MACHINE") && !ProcessMachineContainer)
6426 if(!strcasecmp(ptr->type, "USER"))
6428 if(!strcasecmp(ptr->member, PRODUCTION_PRINCIPAL) ||
6429 !strcasecmp(ptr->member, TEST_PRINCIPAL))
6435 if ((rc = check_user(ldap_handle, dn_path, ptr->member,
6436 "")) == AD_NO_USER_FOUND)
6438 com_err(whoami, 0, "creating user %s", ptr->member);
6440 av[0] = ptr->member;
6441 call_args[0] = (char *)ldap_handle;
6442 call_args[1] = dn_path;
6444 call_args[3] = NULL;
6447 if (rc = mr_query("get_user_account_by_login", 1, av,
6448 save_query_info, save_argv))
6450 com_err(whoami, 0, "Unable to create user %s "
6451 "while populating group %s.", ptr->member,
6457 if (rc = user_create(U_END, save_argv, call_args))
6459 com_err(whoami, 0, "Unable to create user %s "
6460 "while populating group %s.", ptr->member,
6468 com_err(whoami, 0, "Unable to create user %s "
6469 "while populating group %s", ptr->member,
6480 sprintf(member, "cn=%s,%s,%s", ptr->member, pUserOu,
6485 sprintf(member, "uid=%s,%s,%s", ptr->member, pUserOu,
6489 else if (!strcasecmp(ptr->type, "STRING"))
6491 if (contact_create(ldap_handle, dn_path, ptr->member,
6495 pUserOu = contact_ou;
6496 sprintf(member, "cn=%s,%s,%s", escape_string(ptr->member),
6499 else if (!strcasecmp(ptr->type, "KERBEROS"))
6501 if (contact_create(ldap_handle, dn_path, ptr->member,
6505 pUserOu = kerberos_ou;
6506 sprintf(member, "cn=%s,%s,%s", escape_string(ptr->member),
6509 else if (!strcasecmp(ptr->type, "MACHINE"))
6511 memset(machine_ou, '\0', sizeof(machine_ou));
6512 memset(NewMachineName, '\0', sizeof(NewMachineName));
6514 if (!get_machine_ou(ldap_handle, dn_path, ptr->member,
6515 machine_ou, NewMachineName))
6517 pUserOu = machine_ou;
6518 sprintf(member, "cn=%s,%s,%s", NewMachineName, pUserOu,
6529 members = (char **)realloc(members, ((i + 2) * sizeof(char *)));
6530 members[i++] = strdup(member);
6535 linklist_free(member_base);
6541 sprintf(group_dn, "cn=%s,%s,%s", group_name, group_ou, dn_path);
6543 if(GroupPopulateDelete)
6546 ADD_ATTR("member", member_v, LDAP_MOD_REPLACE);
6549 if ((rc = ldap_modify_s(ldap_handle, group_dn,
6550 mods)) != LDAP_SUCCESS)
6553 "Unable to populate group membership for %s: %s",
6554 group_dn, ldap_err2string(rc));
6557 for (i = 0; i < n; i++)
6562 ADD_ATTR("member", members, LDAP_MOD_REPLACE);
6565 if ((rc = ldap_modify_s(ldap_handle, group_dn,
6566 mods)) != LDAP_SUCCESS)
6569 "Unable to populate group membership for %s: %s",
6570 group_dn, ldap_err2string(rc));
6573 for (i = 0; i < n; i++)
6581 int process_group(LDAP *ldap_handle, char *dn_path, char *MoiraId,
6582 char *group_name, char *group_ou, char *group_membership,
6583 int group_security_flag, int type, char *maillist,
6586 char before_desc[512];
6587 char before_name[256];
6588 char before_group_ou[256];
6589 char before_group_membership[2];
6590 char distinguishedName[256];
6591 char ad_distinguishedName[256];
6593 char *attr_array[3];
6594 int before_security_flag;
6597 LK_ENTRY *group_base;
6600 char ou_security[512];
6601 char ou_distribution[512];
6602 char ou_neither[512];
6605 memset(ad_distinguishedName, '\0', sizeof(ad_distinguishedName));
6606 sprintf(distinguishedName, "CN=%s,%s,%s", group_name, group_ou, dn_path);
6608 memset(filter, '\0', sizeof(filter));
6612 if (rc = ad_get_group(ldap_handle, dn_path, group_name,
6614 "samAccountName", &group_base,
6615 &group_count, filter))
6618 if (type == CHECK_GROUPS)
6620 if (group_count == 1)
6622 strcpy(group_dn, group_base->dn);
6624 if (!strcasecmp(group_dn, distinguishedName))
6626 linklist_free(group_base);
6631 linklist_free(group_base);
6633 if (group_count == 0)
6634 return(AD_NO_GROUPS_FOUND);
6636 if (group_count == 1)
6637 return(AD_WRONG_GROUP_DN_FOUND);
6639 return(AD_MULTIPLE_GROUPS_FOUND);
6642 if (group_count == 0)
6644 return(AD_NO_GROUPS_FOUND);
6647 if (group_count > 1)
6651 strcpy(group_dn, ptr->dn);
6655 if (!strcasecmp(group_dn, ptr->value))
6663 com_err(whoami, 0, "%d groups with moira id = %s", group_count,
6669 com_err(whoami, 0, "%s with moira id = %s", ptr->value, MoiraId);
6673 linklist_free(group_base);
6674 return(AD_MULTIPLE_GROUPS_FOUND);
6681 strcpy(group_dn, ptr->dn);
6683 if (strcasecmp(group_dn, ptr->value))
6684 rc = ldap_delete_s(ldap_handle, ptr->value);
6689 linklist_free(group_base);
6690 memset(filter, '\0', sizeof(filter));
6694 if (rc = ad_get_group(ldap_handle, dn_path, group_name,
6696 "samAccountName", &group_base,
6697 &group_count, filter))
6700 if (group_count == 0)
6701 return(AD_NO_GROUPS_FOUND);
6703 if (group_count > 1)
6704 return(AD_MULTIPLE_GROUPS_FOUND);
6707 strcpy(ad_distinguishedName, group_base->dn);
6708 linklist_free(group_base);
6712 attr_array[0] = "sAMAccountName";
6713 attr_array[1] = NULL;
6715 if ((rc = linklist_build(ldap_handle, dn_path, filter, attr_array,
6716 &group_base, &group_count,
6717 LDAP_SCOPE_SUBTREE)) != 0)
6719 com_err(whoami, 0, "Unable to get list info with MoiraId = %s: %s",
6720 MoiraId, ldap_err2string(rc));
6724 sprintf(filter, "(sAMAccountName=%s)", group_base->value);
6726 if (!strcasecmp(ad_distinguishedName, distinguishedName))
6728 linklist_free(group_base);
6734 linklist_free(group_base);
6737 memset(ou_both, '\0', sizeof(ou_both));
6738 memset(ou_security, '\0', sizeof(ou_security));
6739 memset(ou_distribution, '\0', sizeof(ou_distribution));
6740 memset(ou_neither, '\0', sizeof(ou_neither));
6741 memset(before_name, '\0', sizeof(before_name));
6742 memset(before_desc, '\0', sizeof(before_desc));
6743 memset(before_group_membership, '\0', sizeof(before_group_membership));
6745 attr_array[0] = "name";
6746 attr_array[1] = NULL;
6748 if ((rc = linklist_build(ldap_handle, dn_path, filter, attr_array,
6749 &group_base, &group_count,
6750 LDAP_SCOPE_SUBTREE)) != 0)
6752 com_err(whoami, 0, "Unable to get list name with MoiraId = %s: %s",
6753 MoiraId, ldap_err2string(rc));
6757 strcpy(before_name, group_base->value);
6758 linklist_free(group_base);
6762 attr_array[0] = "description";
6763 attr_array[1] = NULL;
6765 if ((rc = linklist_build(ldap_handle, dn_path, filter, attr_array,
6766 &group_base, &group_count,
6767 LDAP_SCOPE_SUBTREE)) != 0)
6770 "Unable to get list description with MoiraId = %s: %s",
6771 MoiraId, ldap_err2string(rc));
6775 if (group_count != 0)
6777 strcpy(before_desc, group_base->value);
6778 linklist_free(group_base);
6783 change_to_lower_case(ad_distinguishedName);
6784 strcpy(ou_both, group_ou_both);
6785 change_to_lower_case(ou_both);
6786 strcpy(ou_security, group_ou_security);
6787 change_to_lower_case(ou_security);
6788 strcpy(ou_distribution, group_ou_distribution);
6789 change_to_lower_case(ou_distribution);
6790 strcpy(ou_neither, group_ou_neither);
6791 change_to_lower_case(ou_neither);
6793 if (strstr(ad_distinguishedName, ou_both))
6795 strcpy(before_group_ou, group_ou_both);
6796 before_group_membership[0] = 'B';
6797 before_security_flag = 1;
6799 else if (strstr(ad_distinguishedName, ou_security))
6801 strcpy(before_group_ou, group_ou_security);
6802 before_group_membership[0] = 'S';
6803 before_security_flag = 1;
6805 else if (strstr(ad_distinguishedName, ou_distribution))
6807 strcpy(before_group_ou, group_ou_distribution);
6808 before_group_membership[0] = 'D';
6809 before_security_flag = 0;
6811 else if (strstr(ad_distinguishedName, ou_neither))
6813 strcpy(before_group_ou, group_ou_neither);
6814 before_group_membership[0] = 'N';
6815 before_security_flag = 0;
6818 return(AD_NO_OU_FOUND);
6820 rc = group_rename(ldap_handle, dn_path, before_name,
6821 before_group_membership,
6822 before_group_ou, before_security_flag, before_desc,
6823 group_name, group_membership, group_ou,
6824 group_security_flag,
6825 before_desc, MoiraId, filter, maillist, nfsgroup);
6830 void change_to_lower_case(char *ptr)
6834 for (i = 0; i < (int)strlen(ptr); i++)
6836 ptr[i] = tolower(ptr[i]);
6840 int ad_get_group(LDAP *ldap_handle, char *dn_path,
6841 char *group_name, char *group_membership,
6842 char *MoiraId, char *attribute,
6843 LK_ENTRY **linklist_base, int *linklist_count,
6848 char *attr_array[3];
6852 (*linklist_base) = NULL;
6853 (*linklist_count) = 0;
6855 if (strlen(rFilter) != 0)
6857 strcpy(filter, rFilter);
6858 attr_array[0] = attribute;
6859 attr_array[1] = NULL;
6861 if ((rc = linklist_build(ldap_handle, dn_path, filter, attr_array,
6862 linklist_base, linklist_count,
6863 LDAP_SCOPE_SUBTREE)) != 0)
6865 com_err(whoami, 0, "Unable to get list info with MoiraId = %s: %s",
6866 MoiraId, ldap_err2string(rc));
6870 if ((*linklist_count) == 1)
6872 strcpy(rFilter, filter);
6877 linklist_free((*linklist_base));
6878 (*linklist_base) = NULL;
6879 (*linklist_count) = 0;
6881 if (strlen(MoiraId) != 0)
6883 sprintf(filter, "(&(objectClass=group)(mitMoiraId=%s))", MoiraId);
6885 attr_array[0] = attribute;
6886 attr_array[1] = NULL;
6888 if ((rc = linklist_build(ldap_handle, dn_path, filter, attr_array,
6889 linklist_base, linklist_count,
6890 LDAP_SCOPE_SUBTREE)) != 0)
6892 com_err(whoami, 0, "Unable to get list info with MoiraId = %s: %s",
6893 MoiraId, ldap_err2string(rc));
6898 if ((*linklist_count) > 1)
6900 com_err(whoami, 0, "multiple groups with mitMoiraId = %s", MoiraId);
6901 pPtr = (*linklist_base);
6905 com_err(whoami, 0, "groups %s has mitMoiraId = %s", pPtr->value,
6910 linklist_free((*linklist_base));
6911 (*linklist_base) = NULL;
6912 (*linklist_count) = 0;
6915 if ((*linklist_count) == 1)
6918 pPtr = (*linklist_base);
6919 dn = strdup(pPtr->dn);
6922 if (!memcmp(dn, group_name, strlen(group_name)))
6924 strcpy(rFilter, filter);
6929 linklist_free((*linklist_base));
6930 (*linklist_base) = NULL;
6931 (*linklist_count) = 0;
6932 sprintf(filter, "(sAMAccountName=%s%s)", group_name, group_suffix);
6934 attr_array[0] = attribute;
6935 attr_array[1] = NULL;
6937 if ((rc = linklist_build(ldap_handle, dn_path, filter, attr_array,
6938 linklist_base, linklist_count,
6939 LDAP_SCOPE_SUBTREE)) != 0)
6941 com_err(whoami, 0, "Unable to get list info with MoiraId = %s: %s",
6942 MoiraId, ldap_err2string(rc));
6946 if ((*linklist_count) == 1)
6948 strcpy(rFilter, filter);
6955 int check_user(LDAP *ldap_handle, char *dn_path, char *UserName, char *MoiraId)
6958 char *attr_array[3];
6959 char SamAccountName[64];
6962 LK_ENTRY *group_base;
6968 if (strlen(MoiraId) != 0)
6970 sprintf(filter, "(&(objectClass=user)(mitMoiraId=%s))", MoiraId);
6972 attr_array[0] = "sAMAccountName";
6973 attr_array[1] = NULL;
6974 if ((rc = linklist_build(ldap_handle, dn_path, filter, attr_array,
6975 &group_base, &group_count,
6976 LDAP_SCOPE_SUBTREE)) != 0)
6978 com_err(whoami, 0, "Unable to process user %s : %s",
6979 UserName, ldap_err2string(rc));
6983 if (group_count > 1)
6985 com_err(whoami, 0, "multiple users exist with MoiraId = %s",
6991 com_err(whoami, 0, "user %s exist with MoiraId = %s",
6992 gPtr->value, MoiraId);
6998 if (group_count != 1)
7000 linklist_free(group_base);
7003 sprintf(filter, "(sAMAccountName=%s)", UserName);
7004 attr_array[0] = "sAMAccountName";
7005 attr_array[1] = NULL;
7007 if ((rc = linklist_build(ldap_handle, dn_path, filter, attr_array,
7008 &group_base, &group_count,
7009 LDAP_SCOPE_SUBTREE)) != 0)
7011 com_err(whoami, 0, "Unable to process user %s : %s",
7012 UserName, ldap_err2string(rc));
7017 if (group_count != 1)
7019 linklist_free(group_base);
7020 return(AD_NO_USER_FOUND);
7023 strcpy(SamAccountName, group_base->value);
7024 linklist_free(group_base);
7028 if (strcmp(SamAccountName, UserName))
7031 "User object %s with MoiraId %s has mismatched usernames "
7032 "(LDAP username %s, Moira username %s)", SamAccountName,
7033 MoiraId, SamAccountName, UserName);
7039 void container_get_dn(char *src, char *dest)
7046 memset(array, '\0', 20 * sizeof(array[0]));
7048 if (strlen(src) == 0)
7070 strcpy(dest, "OU=");
7074 strcat(dest, array[n-1]);
7078 strcat(dest, ",OU=");
7085 void container_get_name(char *src, char *dest)
7090 if (strlen(src) == 0)
7110 void container_check(LDAP *ldap_handle, char *dn_path, char *name)
7117 strcpy(cName, name);
7119 for (i = 0; i < (int)strlen(cName); i++)
7121 if (cName[i] == '/')
7124 av[CONTAINER_NAME] = cName;
7125 av[CONTAINER_DESC] = "";
7126 av[CONTAINER_LOCATION] = "";
7127 av[CONTAINER_CONTACT] = "";
7128 av[CONTAINER_TYPE] = "";
7129 av[CONTAINER_ID] = "";
7130 av[CONTAINER_ROWID] = "";
7131 rc = container_create(ldap_handle, dn_path, 7, av);
7133 if (rc == LDAP_SUCCESS)
7135 com_err(whoami, 0, "container %s created without a mitMoiraId",
7144 int container_rename(LDAP *ldap_handle, char *dn_path, int beforec,
7145 char **before, int afterc, char **after)
7150 char new_dn_path[256];
7152 char distinguishedName[256];
7157 memset(cName, '\0', sizeof(cName));
7158 container_get_name(after[CONTAINER_NAME], cName);
7160 if (!check_container_name(cName))
7162 com_err(whoami, 0, "Unable to process invalid LDAP container name %s",
7164 return(AD_INVALID_NAME);
7167 memset(distinguishedName, '\0', sizeof(distinguishedName));
7169 if (rc = container_get_distinguishedName(ldap_handle, dn_path,
7170 distinguishedName, beforec, before))
7173 if (strlen(distinguishedName) == 0)
7175 rc = container_create(ldap_handle, dn_path, afterc, after);
7179 strcpy(temp, after[CONTAINER_NAME]);
7182 for (i = 0; i < (int)strlen(temp); i++)
7192 container_get_dn(temp, dName);
7194 if (strlen(temp) != 0)
7195 sprintf(new_dn_path, "%s,%s", dName, dn_path);
7197 sprintf(new_dn_path, "%s", dn_path);
7199 sprintf(new_cn, "OU=%s", cName);
7201 container_check(ldap_handle, dn_path, after[CONTAINER_NAME]);
7203 if ((rc = ldap_rename_s(ldap_handle, distinguishedName, new_cn, new_dn_path,
7204 TRUE, NULL, NULL)) != LDAP_SUCCESS)
7206 com_err(whoami, 0, "Unable to rename container from %s to %s : %s",
7207 before[CONTAINER_NAME], after[CONTAINER_NAME],
7208 ldap_err2string(rc));
7212 memset(dName, '\0', sizeof(dName));
7213 container_get_dn(after[CONTAINER_NAME], dName);
7214 rc = container_adupdate(ldap_handle, dn_path, dName, "", afterc, after);
7219 int container_delete(LDAP *ldap_handle, char *dn_path, int count, char **av)
7221 char distinguishedName[256];
7224 memset(distinguishedName, '\0', sizeof(distinguishedName));
7226 if (rc = container_get_distinguishedName(ldap_handle, dn_path,
7227 distinguishedName, count, av))
7230 if (strlen(distinguishedName) == 0)
7233 if ((rc = ldap_delete_s(ldap_handle, distinguishedName)) != LDAP_SUCCESS)
7235 if (rc == LDAP_NOT_ALLOWED_ON_NONLEAF)
7236 container_move_objects(ldap_handle, dn_path, distinguishedName);
7238 com_err(whoami, 0, "Unable to delete container %s from directory : %s",
7239 av[CONTAINER_NAME], ldap_err2string(rc));
7245 int container_create(LDAP *ldap_handle, char *dn_path, int count, char **av)
7247 char *attr_array[3];
7248 LK_ENTRY *group_base;
7251 char *objectClass_v[] = {"top",
7252 "organizationalUnit",
7255 char *ou_v[] = {NULL, NULL};
7256 char *name_v[] = {NULL, NULL};
7257 char *moiraId_v[] = {NULL, NULL};
7258 char *desc_v[] = {NULL, NULL};
7259 char *managedBy_v[] = {NULL, NULL};
7262 char managedByDN[256];
7269 memset(filter, '\0', sizeof(filter));
7270 memset(dName, '\0', sizeof(dName));
7271 memset(cName, '\0', sizeof(cName));
7272 memset(managedByDN, '\0', sizeof(managedByDN));
7273 container_get_dn(av[CONTAINER_NAME], dName);
7274 container_get_name(av[CONTAINER_NAME], cName);
7276 if ((strlen(cName) == 0) || (strlen(dName) == 0))
7278 com_err(whoami, 0, "Unable to process invalid LDAP container name %s",
7280 return(AD_INVALID_NAME);
7283 if (!check_container_name(cName))
7285 com_err(whoami, 0, "Unable to process invalid LDAP container name %s",
7287 return(AD_INVALID_NAME);
7291 ADD_ATTR("objectClass", objectClass_v, LDAP_MOD_ADD);
7293 ADD_ATTR("name", name_v, LDAP_MOD_ADD);
7295 ADD_ATTR("ou", ou_v, LDAP_MOD_ADD);
7297 if (strlen(av[CONTAINER_ROWID]) != 0)
7299 moiraId_v[0] = av[CONTAINER_ROWID];
7300 ADD_ATTR("mitMoiraId", moiraId_v, LDAP_MOD_ADD);
7303 if (strlen(av[CONTAINER_DESC]) != 0)
7305 desc_v[0] = av[CONTAINER_DESC];
7306 ADD_ATTR("description", desc_v, LDAP_MOD_ADD);
7309 if ((strlen(av[CONTAINER_TYPE]) != 0) && (strlen(av[CONTAINER_ID]) != 0))
7311 if (!strcasecmp(av[CONTAINER_TYPE], "KERBEROS"))
7313 if (!contact_create(ldap_handle, dn_path, av[CONTAINER_ID],
7316 sprintf(managedByDN, "CN=%s,%s,%s", av[CONTAINER_ID],
7317 kerberos_ou, dn_path);
7318 managedBy_v[0] = managedByDN;
7319 ADD_ATTR("managedBy", managedBy_v, LDAP_MOD_ADD);
7324 if (!strcasecmp(av[CONTAINER_TYPE], "USER"))
7326 sprintf(filter, "(&(cn=%s)(&(objectCategory=person)"
7327 "(objectClass=user)))", av[CONTAINER_ID]);
7330 if (!strcasecmp(av[CONTAINER_TYPE], "LIST"))
7332 sprintf(filter, "(&(objectClass=group)(cn=%s))",
7336 if (strlen(filter) != 0)
7338 attr_array[0] = "distinguishedName";
7339 attr_array[1] = NULL;
7342 if ((rc = linklist_build(ldap_handle, dn_path, filter,
7344 &group_base, &group_count,
7345 LDAP_SCOPE_SUBTREE)) == LDAP_SUCCESS)
7347 if (group_count == 1)
7349 strcpy(managedByDN, group_base->value);
7350 managedBy_v[0] = managedByDN;
7351 ADD_ATTR("managedBy", managedBy_v, LDAP_MOD_ADD);
7353 linklist_free(group_base);
7363 sprintf(temp, "%s,%s", dName, dn_path);
7364 rc = ldap_add_ext_s(ldap_handle, temp, mods, NULL, NULL);
7366 for (i = 0; i < n; i++)
7369 if ((rc != LDAP_SUCCESS) && (rc != LDAP_ALREADY_EXISTS))
7371 com_err(whoami, 0, "Unable to create container %s : %s",
7372 cName, ldap_err2string(rc));
7376 if (rc == LDAP_ALREADY_EXISTS)
7378 if (strlen(av[CONTAINER_ROWID]) != 0)
7379 rc = container_adupdate(ldap_handle, dn_path, dName, "", count, av);
7385 int container_update(LDAP *ldap_handle, char *dn_path, int beforec,
7386 char **before, int afterc, char **after)
7388 char distinguishedName[256];
7391 memset(distinguishedName, '\0', sizeof(distinguishedName));
7393 if (rc = container_get_distinguishedName(ldap_handle, dn_path,
7394 distinguishedName, afterc, after))
7397 if (strlen(distinguishedName) == 0)
7399 rc = container_create(ldap_handle, dn_path, afterc, after);
7403 container_check(ldap_handle, dn_path, after[CONTAINER_NAME]);
7404 rc = container_adupdate(ldap_handle, dn_path, "", distinguishedName, afterc,
7410 int container_get_distinguishedName(LDAP *ldap_handle, char *dn_path,
7411 char *distinguishedName, int count,
7414 char *attr_array[3];
7415 LK_ENTRY *group_base;
7422 memset(filter, '\0', sizeof(filter));
7423 memset(dName, '\0', sizeof(dName));
7424 memset(cName, '\0', sizeof(cName));
7425 container_get_dn(av[CONTAINER_NAME], dName);
7426 container_get_name(av[CONTAINER_NAME], cName);
7428 if (strlen(dName) == 0)
7430 com_err(whoami, 0, "Unable to process invalid LDAP container name %s",
7431 av[CONTAINER_NAME]);
7432 return(AD_INVALID_NAME);
7435 if (!check_container_name(cName))
7437 com_err(whoami, 0, "Unable to process invalid LDAP container name %s",
7439 return(AD_INVALID_NAME);
7442 sprintf(filter, "(&(objectClass=organizationalUnit)(mitMoiraId=%s))",
7443 av[CONTAINER_ROWID]);
7444 attr_array[0] = "distinguishedName";
7445 attr_array[1] = NULL;
7449 if ((rc = linklist_build(ldap_handle, dn_path, filter, attr_array,
7450 &group_base, &group_count,
7451 LDAP_SCOPE_SUBTREE)) == LDAP_SUCCESS)
7453 if (group_count == 1)
7455 strcpy(distinguishedName, group_base->value);
7458 linklist_free(group_base);
7463 if (strlen(distinguishedName) == 0)
7465 sprintf(filter, "(&(objectClass=organizationalUnit)"
7466 "(distinguishedName=%s,%s))", dName, dn_path);
7467 attr_array[0] = "distinguishedName";
7468 attr_array[1] = NULL;
7472 if ((rc = linklist_build(ldap_handle, dn_path, filter, attr_array,
7473 &group_base, &group_count,
7474 LDAP_SCOPE_SUBTREE)) == LDAP_SUCCESS)
7476 if (group_count == 1)
7478 strcpy(distinguishedName, group_base->value);
7481 linklist_free(group_base);
7490 int container_adupdate(LDAP *ldap_handle, char *dn_path, char *dName,
7491 char *distinguishedName, int count, char **av)
7493 char *attr_array[5];
7494 LK_ENTRY *group_base;
7499 char *moiraId_v[] = {NULL, NULL};
7500 char *desc_v[] = {NULL, NULL};
7501 char *managedBy_v[] = {NULL, NULL};
7502 char managedByDN[256];
7511 strcpy(ad_path, distinguishedName);
7513 if (strlen(dName) != 0)
7514 sprintf(ad_path, "%s,%s", dName, dn_path);
7516 sprintf(filter, "(&(objectClass=organizationalUnit)(distinguishedName=%s))",
7519 if (strlen(av[CONTAINER_ID]) != 0)
7520 sprintf(filter, "(&(objectClass=organizationalUnit)(mitMoiraId=%s))",
7521 av[CONTAINER_ROWID]);
7523 attr_array[0] = "mitMoiraId";
7524 attr_array[1] = "description";
7525 attr_array[2] = "managedBy";
7526 attr_array[3] = NULL;
7530 if ((rc = linklist_build(ldap_handle, dn_path, filter, attr_array,
7531 &group_base, &group_count,
7532 LDAP_SCOPE_SUBTREE)) != LDAP_SUCCESS)
7534 com_err(whoami, 0, "Unable to retreive container info for %s : %s",
7535 av[CONTAINER_NAME], ldap_err2string(rc));
7539 memset(managedByDN, '\0', sizeof(managedByDN));
7540 memset(moiraId, '\0', sizeof(moiraId));
7541 memset(desc, '\0', sizeof(desc));
7546 if (!strcasecmp(pPtr->attribute, "description"))
7547 strcpy(desc, pPtr->value);
7548 else if (!strcasecmp(pPtr->attribute, "managedBy"))
7549 strcpy(managedByDN, pPtr->value);
7550 else if (!strcasecmp(pPtr->attribute, "mitMoiraId"))
7551 strcpy(moiraId, pPtr->value);
7555 linklist_free(group_base);
7560 if (strlen(av[CONTAINER_ROWID]) != 0)
7562 moiraId_v[0] = av[CONTAINER_ROWID];
7563 ADD_ATTR("mitMoiraId", moiraId_v, LDAP_MOD_REPLACE);
7566 if (strlen(av[CONTAINER_DESC]) != 0)
7568 attribute_update(ldap_handle, ad_path, av[CONTAINER_DESC], "description",
7573 if (strlen(desc) != 0)
7575 attribute_update(ldap_handle, ad_path, "", "description", dName);
7579 if ((strlen(av[CONTAINER_TYPE]) != 0) && (strlen(av[CONTAINER_ID]) != 0))
7581 if (!strcasecmp(av[CONTAINER_TYPE], "KERBEROS"))
7583 if (!contact_create(ldap_handle, dn_path, av[CONTAINER_ID],
7586 sprintf(managedByDN, "CN=%s,%s,%s", av[CONTAINER_ID],
7587 kerberos_ou, dn_path);
7588 managedBy_v[0] = managedByDN;
7589 ADD_ATTR("managedBy", managedBy_v, LDAP_MOD_REPLACE);
7593 if (strlen(managedByDN) != 0)
7595 attribute_update(ldap_handle, ad_path, "", "managedBy",
7602 memset(filter, '\0', sizeof(filter));
7604 if (!strcasecmp(av[CONTAINER_TYPE], "USER"))
7606 sprintf(filter, "(&(cn=%s)(&(objectCategory=person)"
7607 "(objectClass=user)))", av[CONTAINER_ID]);
7610 if (!strcasecmp(av[CONTAINER_TYPE], "LIST"))
7612 sprintf(filter, "(&(objectClass=group)(cn=%s))",
7616 if (strlen(filter) != 0)
7618 attr_array[0] = "distinguishedName";
7619 attr_array[1] = NULL;
7622 if ((rc = linklist_build(ldap_handle, dn_path, filter,
7623 attr_array, &group_base, &group_count,
7624 LDAP_SCOPE_SUBTREE)) == LDAP_SUCCESS)
7626 if (group_count == 1)
7628 strcpy(managedByDN, group_base->value);
7629 managedBy_v[0] = managedByDN;
7630 ADD_ATTR("managedBy", managedBy_v, LDAP_MOD_REPLACE);
7634 if (strlen(managedByDN) != 0)
7636 attribute_update(ldap_handle, ad_path, "",
7637 "managedBy", dName);
7641 linklist_free(group_base);
7648 if (strlen(managedByDN) != 0)
7650 attribute_update(ldap_handle, ad_path, "", "managedBy",
7660 return(LDAP_SUCCESS);
7662 rc = ldap_modify_s(ldap_handle, ad_path, mods);
7664 for (i = 0; i < n; i++)
7667 if (rc != LDAP_SUCCESS)
7669 com_err(whoami, 0, "Unable to modify container info for %s : %s",
7670 av[CONTAINER_NAME], ldap_err2string(rc));
7677 int container_move_objects(LDAP *ldap_handle, char *dn_path, char *dName)
7679 char *attr_array[3];
7680 LK_ENTRY *group_base;
7687 int NumberOfEntries = 10;
7691 rc = ldap_set_option(ldap_handle, LDAP_OPT_SIZELIMIT, &NumberOfEntries);
7693 for (i = 0; i < 3; i++)
7695 memset(filter, '\0', sizeof(filter));
7699 strcpy(filter, "(!(|(objectClass=computer)"
7700 "(objectClass=organizationalUnit)))");
7701 attr_array[0] = "cn";
7702 attr_array[1] = NULL;
7706 strcpy(filter, "(objectClass=computer)");
7707 attr_array[0] = "cn";
7708 attr_array[1] = NULL;
7712 strcpy(filter, "(objectClass=organizationalUnit)");
7713 attr_array[0] = "ou";
7714 attr_array[1] = NULL;
7719 if ((rc = linklist_build(ldap_handle, dName, filter, attr_array,
7720 &group_base, &group_count,
7721 LDAP_SCOPE_SUBTREE)) != LDAP_SUCCESS)
7726 if (group_count == 0)
7733 if (!strcasecmp(pPtr->attribute, "cn"))
7735 sprintf(new_cn, "cn=%s", pPtr->value);
7737 sprintf(temp, "%s,%s", orphans_other_ou, dn_path);
7739 sprintf(temp, "%s,%s", orphans_machines_ou, dn_path);
7744 rc = ldap_rename_s(ldap_handle, pPtr->dn, new_cn, temp,
7746 if (rc == LDAP_ALREADY_EXISTS)
7748 sprintf(new_cn, "cn=%s_%d", pPtr->value, count);
7755 else if (!strcasecmp(pPtr->attribute, "ou"))
7757 rc = ldap_delete_s(ldap_handle, pPtr->dn);
7763 linklist_free(group_base);
7772 int get_machine_ou(LDAP *ldap_handle, char *dn_path, char *member,
7773 char *machine_ou, char *NewMachineName)
7775 LK_ENTRY *group_base;
7779 char *attr_array[3];
7786 strcpy(NewMachineName, member);
7787 rc = moira_connect();
7788 rc = GetMachineName(NewMachineName);
7791 if (strlen(NewMachineName) == 0)
7793 com_err(whoami, 0, "Unable to find alais for machine %s in Moira",
7799 pPtr = strchr(NewMachineName, '.');
7806 sprintf(filter, "(sAMAccountName=%s$)", NewMachineName);
7807 attr_array[0] = "cn";
7808 attr_array[1] = NULL;
7809 sprintf(temp, "%s", dn_path);
7811 if ((rc = linklist_build(ldap_handle, temp, filter, attr_array,
7812 &group_base, &group_count,
7813 LDAP_SCOPE_SUBTREE)) != 0)
7815 com_err(whoami, 0, "Unable to process machine %s : %s",
7816 member, ldap_err2string(rc));
7820 if (group_count != 1)
7825 strcpy(dn, group_base->dn);
7826 strcpy(cn, group_base->value);
7828 for (i = 0; i < (int)strlen(dn); i++)
7829 dn[i] = tolower(dn[i]);
7831 for (i = 0; i < (int)strlen(cn); i++)
7832 cn[i] = tolower(cn[i]);
7834 linklist_free(group_base);
7836 pPtr = strstr(dn, cn);
7840 com_err(whoami, 0, "Unable to process machine %s",
7845 pPtr += strlen(cn) + 1;
7846 strcpy(machine_ou, pPtr);
7848 pPtr = strstr(machine_ou, "dc=");
7852 com_err(whoami, 0, "Unable to process machine %s",
7863 int machine_move_to_ou(LDAP *ldap_handle, char * dn_path,
7864 char *MoiraMachineName, char *DestinationOu)
7868 char MachineName[128];
7870 char *attr_array[3];
7875 LK_ENTRY *group_base;
7880 strcpy(MachineName, MoiraMachineName);
7881 rc = GetMachineName(MachineName);
7883 if (strlen(MachineName) == 0)
7885 com_err(whoami, 0, "Unable to find alais for machine %s in Moira",
7890 cPtr = strchr(MachineName, '.');
7895 sprintf(filter, "(sAMAccountName=%s$)", MachineName);
7896 attr_array[0] = "sAMAccountName";
7897 attr_array[1] = NULL;
7899 if ((rc = linklist_build(ldap_handle, dn_path, filter, attr_array,
7901 &group_count, LDAP_SCOPE_SUBTREE)) != 0)
7903 com_err(whoami, 0, "Unable to process machine %s : %s",
7904 MoiraMachineName, ldap_err2string(rc));
7908 if (group_count == 1)
7909 strcpy(OldDn, group_base->dn);
7911 linklist_free(group_base);
7914 if (group_count != 1)
7916 com_err(whoami, 0, "Unable to find machine %s in directory: %s",
7921 sprintf(NewOu, "%s,%s", DestinationOu, dn_path);
7922 cPtr = strchr(OldDn, ',');
7927 if (!strcasecmp(cPtr, NewOu))
7931 sprintf(NewCn, "CN=%s", MachineName);
7932 rc = ldap_rename_s(ldap_handle, OldDn, NewCn, NewOu, TRUE, NULL, NULL);
7937 int machine_check(LDAP *ldap_handle, char *dn_path, char *machine_name)
7943 memset(Name, '\0', sizeof(Name));
7944 strcpy(Name, machine_name);
7946 pPtr = strchr(Name, '.');
7952 return(!(rc = checkADname(ldap_handle, dn_path, Name)));
7955 int machine_get_moira_container(LDAP *ldap_handle, char *dn_path,
7956 char *machine_name, char *container_name)
7962 av[0] = machine_name;
7963 call_args[0] = (char *)container_name;
7964 rc = mr_query("get_machine_to_container_map", 1, av,
7965 machine_GetMoiraContainer, call_args);
7969 int machine_GetMoiraContainer(int ac, char **av, void *ptr)
7974 strcpy(call_args[0], av[1]);
7978 int Moira_container_group_create(char **after)
7984 memset(GroupName, '\0', sizeof(GroupName));
7985 rc = Moira_groupname_create(GroupName, after[CONTAINER_NAME],
7986 after[CONTAINER_ROWID]);
7990 argv[L_NAME] = GroupName;
7991 argv[L_ACTIVE] = "1";
7992 argv[L_PUBLIC] = "0";
7993 argv[L_HIDDEN] = "0";
7994 argv[L_MAILLIST] = "0";
7995 argv[L_GROUP] = "1";
7996 argv[L_GID] = UNIQUE_GID;
7997 argv[L_NFSGROUP] = "0";
7998 argv[L_MAILMAN] = "0";
7999 argv[L_MAILMAN_SERVER] = "[NONE]";
8000 argv[L_DESC] = "auto created container group";
8001 argv[L_ACE_TYPE] = "USER";
8002 argv[L_MEMACE_TYPE] = "USER";
8003 argv[L_ACE_NAME] = "sms";
8004 argv[L_MEMACE_NAME] = "sms";
8006 if (rc = mr_query("add_list", 15, argv, NULL, NULL))
8009 "Unable to create container group %s for container %s: %s",
8010 GroupName, after[CONTAINER_NAME], error_message(rc));
8013 Moira_setContainerGroup(after[CONTAINER_NAME], GroupName);
8014 Moira_addGroupToParent(after[CONTAINER_NAME], GroupName);
8019 int Moira_container_group_update(char **before, char **after)
8022 char BeforeGroupName[64];
8023 char AfterGroupName[64];
8026 if (!strcasecmp(after[CONTAINER_NAME], before[CONTAINER_NAME]))
8029 memset(BeforeGroupName, '\0', sizeof(BeforeGroupName));
8030 Moira_getGroupName(after[CONTAINER_NAME], BeforeGroupName, 0);
8031 if (strlen(BeforeGroupName) == 0)
8034 memset(AfterGroupName, '\0', sizeof(AfterGroupName));
8035 rc = Moira_groupname_create(AfterGroupName, after[CONTAINER_NAME],
8036 after[CONTAINER_ROWID]);
8040 if (strcasecmp(BeforeGroupName, AfterGroupName))
8042 argv[L_NAME] = BeforeGroupName;
8043 argv[L_NAME + 1] = AfterGroupName;
8044 argv[L_ACTIVE + 1] = "1";
8045 argv[L_PUBLIC + 1] = "0";
8046 argv[L_HIDDEN + 1] = "0";
8047 argv[L_MAILLIST + 1] = "0";
8048 argv[L_GROUP + 1] = "1";
8049 argv[L_GID + 1] = UNIQUE_GID;
8050 argv[L_NFSGROUP + 1] = "0";
8051 argv[L_MAILMAN + 1] = "0";
8052 argv[L_MAILMAN_SERVER + 1] = "[NONE]";
8053 argv[L_DESC + 1] = "auto created container group";
8054 argv[L_ACE_TYPE + 1] = "USER";
8055 argv[L_MEMACE_TYPE + 1] = "USER";
8056 argv[L_ACE_NAME + 1] = "sms";
8057 argv[L_MEMACE_NAME + 1] = "sms";
8059 if (rc = mr_query("update_list", 16, argv, NULL, NULL))
8062 "Unable to rename container group from %s to %s: %s",
8063 BeforeGroupName, AfterGroupName, error_message(rc));
8070 int Moira_container_group_delete(char **before)
8075 char ParentGroupName[64];
8077 memset(ParentGroupName, '\0', sizeof(ParentGroupName));
8078 Moira_getGroupName(before[CONTAINER_NAME], ParentGroupName, 1);
8080 memset(GroupName, '\0', sizeof(GroupName));
8082 if (strcmp(before[CONTAINER_GROUP_NAME], "[none]"))
8083 strcpy(GroupName, before[CONTAINER_GROUP_NAME]);
8085 if ((strlen(ParentGroupName) != 0) && (strlen(GroupName) != 0))
8087 argv[0] = ParentGroupName;
8089 argv[2] = GroupName;
8091 if (rc = mr_query("delete_member_from_list", 3, argv, NULL, NULL))
8094 "Unable to delete container group %s from list: %s",
8095 GroupName, ParentGroupName, error_message(rc));
8099 if (strlen(GroupName) != 0)
8101 argv[0] = GroupName;
8103 if (rc = mr_query("delete_list", 1, argv, NULL, NULL))
8105 com_err(whoami, 0, "Unable to delete container group %s : %s",
8106 GroupName, error_message(rc));
8113 int Moira_groupname_create(char *GroupName, char *ContainerName,
8114 char *ContainerRowID)
8119 char newGroupName[64];
8120 char tempGroupName[64];
8126 strcpy(temp, ContainerName);
8128 ptr1 = strrchr(temp, '/');
8134 ptr1 = strrchr(temp, '/');
8138 sprintf(tempgname, "%s-%s", ++ptr1, ptr);
8141 strcpy(tempgname, ptr);
8144 strcpy(tempgname, temp);
8146 if (strlen(tempgname) > 25)
8147 tempgname[25] ='\0';
8149 sprintf(newGroupName, "cnt-%s", tempgname);
8151 /* change everything to lower case */
8157 *ptr = tolower(*ptr);
8165 strcpy(tempGroupName, newGroupName);
8168 /* append 0-9 then a-z if a duplicate is found */
8171 argv[0] = newGroupName;
8173 if (rc = mr_query("get_list_info", 1, argv, NULL, NULL))
8175 if (rc == MR_NO_MATCH)
8177 com_err(whoami, 0, "Moira error while creating group name for "
8178 "container %s : %s", ContainerName, error_message(rc));
8182 sprintf(newGroupName, "%s-%c", tempGroupName, i);
8186 com_err(whoami, 0, "Unable to find a unique group name for "
8187 "container %s: too many duplicate container names",
8198 strcpy(GroupName, newGroupName);
8202 int Moira_setContainerGroup(char *origContainerName, char *GroupName)
8207 argv[0] = origContainerName;
8208 argv[1] = GroupName;
8210 if ((rc = mr_query("set_container_list", 2, argv, NULL, NULL)))
8213 "Unable to set container group %s in container %s: %s",
8214 GroupName, origContainerName, error_message(rc));
8220 int Moira_addGroupToParent(char *origContainerName, char *GroupName)
8222 char ContainerName[64];
8223 char ParentGroupName[64];
8227 strcpy(ContainerName, origContainerName);
8229 Moira_getGroupName(ContainerName, ParentGroupName, 1);
8231 /* top-level container */
8232 if (strlen(ParentGroupName) == 0)
8235 argv[0] = ParentGroupName;
8237 argv[2] = GroupName;
8239 if ((rc = mr_query("add_member_to_list", 3, argv, NULL, NULL)))
8242 "Unable to add container group %s to parent group %s: %s",
8243 GroupName, ParentGroupName, error_message(rc));
8249 int Moira_getContainerGroup(int ac, char **av, void *ptr)
8254 strcpy(call_args[0], av[1]);
8259 int Moira_getGroupName(char *origContainerName, char *GroupName,
8262 char ContainerName[64];
8268 strcpy(ContainerName, origContainerName);
8272 ptr = strrchr(ContainerName, '/');
8280 argv[0] = ContainerName;
8282 call_args[0] = GroupName;
8283 call_args[1] = NULL;
8285 if (!(rc = mr_query("get_container_list", 1, argv, Moira_getContainerGroup,
8288 if (strlen(GroupName) != 0)
8293 com_err(whoami, 0, "Unable to get container group from container %s: %s",
8294 ContainerName, error_message(rc));
8296 com_err(whoami, 0, "Unable to get container group from container %s",
8302 int Moira_process_machine_container_group(char *MachineName, char* GroupName,
8308 if (strcmp(GroupName, "[none]") == 0)
8311 argv[0] = GroupName;
8312 argv[1] = "MACHINE";
8313 argv[2] = MachineName;
8316 rc = mr_query("add_member_to_list", 3, argv, NULL, NULL);
8318 rc = mr_query("delete_member_from_list", 3, argv, NULL, NULL);
8322 com_err(whoami, 0, "Unable to add machine %s to container group%s: %s",
8323 MachineName, GroupName, error_message(rc));
8329 int GetMachineName(char *MachineName)
8332 char NewMachineName[1024];
8339 // If the address happens to be in the top-level MIT domain, great!
8340 strcpy(NewMachineName, MachineName);
8342 for (i = 0; i < (int)strlen(NewMachineName); i++)
8343 NewMachineName[i] = toupper(NewMachineName[i]);
8345 szDot = strchr(NewMachineName,'.');
8347 if ((szDot) && (!strcasecmp(szDot+1, DOMAIN_SUFFIX)))
8352 // If not, see if it has a Moira alias in the top-level MIT domain.
8353 memset(NewMachineName, '\0', sizeof(NewMachineName));
8355 args[1] = MachineName;
8356 call_args[0] = NewMachineName;
8357 call_args[1] = NULL;
8359 if (rc = mr_query("get_hostalias", 2, args, ProcessMachineName, call_args))
8361 com_err(whoami, 0, "Unable to resolve machine name %s : %s",
8362 MachineName, error_message(rc));
8363 strcpy(MachineName, "");
8367 if (strlen(NewMachineName) != 0)
8368 strcpy(MachineName, NewMachineName);
8370 strcpy(MachineName, "");
8375 int ProcessMachineName(int ac, char **av, void *ptr)
8378 char MachineName[1024];
8384 if (strlen(call_args[0]) == 0)
8386 strcpy(MachineName, av[0]);
8388 for (i = 0; i < (int)strlen(MachineName); i++)
8389 MachineName[i] = toupper(MachineName[i]);
8391 szDot = strchr(MachineName,'.');
8393 if ((szDot) && (!strcasecmp(szDot+1,DOMAIN_SUFFIX)))
8395 strcpy(call_args[0], MachineName);
8402 void SwitchSFU(LDAPMod **mods, int *UseSFU30, int n)
8408 for (i = 0; i < n; i++)
8410 if (!strcmp(mods[i]->mod_type, "msSFU30UidNumber"))
8411 mods[i]->mod_type = "uidNumber";
8418 for (i = 0; i < n; i++)
8420 if (!strcmp(mods[i]->mod_type, "uidNumber"))
8421 mods[i]->mod_type = "msSFU30UidNumber";
8428 int SetHomeDirectory(LDAP *ldap_handle, char *user_name,
8429 char *DistinguishedName,
8430 char *WinHomeDir, char *WinProfileDir,
8431 char **homedir_v, char **winProfile_v,
8432 char **drives_v, LDAPMod **mods,
8439 char winProfile[1024];
8442 char apple_homedir[1024];
8443 char *apple_homedir_v[] = {NULL, NULL};
8447 LDAPMod *DelMods[20];
8449 char *save_argv[FS_END];
8450 char *fsgroup_save_argv[2];
8452 memset(homeDrive, '\0', sizeof(homeDrive));
8453 memset(path, '\0', sizeof(path));
8454 memset(winPath, '\0', sizeof(winPath));
8455 memset(winProfile, '\0', sizeof(winProfile));
8457 if(!ActiveDirectory)
8459 if (rc = moira_connect())
8461 critical_alert(whoami, "Ldap incremental",
8462 "Error contacting Moira server : %s",
8467 argv[0] = user_name;
8469 if (!(rc = mr_query("get_filesys_by_label", 1, argv, save_query_info,
8472 if(!strcmp(save_argv[FS_TYPE], "FSGROUP") ||
8473 !strcmp(save_argv[FS_TYPE], "MUL"))
8476 argv[0] = save_argv[FS_NAME];
8479 if (!(rc = mr_query("get_fsgroup_members", 1, argv,
8480 save_fsgroup_info, fsgroup_save_argv)))
8484 argv[0] = fsgroup_save_argv[0];
8486 if (!(rc = mr_query("get_filesys_by_label", 1, argv,
8487 save_query_info, save_argv)))
8489 strcpy(path, save_argv[FS_PACK]);
8496 strcpy(path, save_argv[FS_PACK]);
8504 if (!strnicmp(path, AFS, strlen(AFS)))
8506 sprintf(homedir, "%s", path);
8507 sprintf(apple_homedir, "%s/MacData", path);
8508 homedir_v[0] = homedir;
8509 apple_homedir_v[0] = apple_homedir;
8510 ADD_ATTR("homeDirectory", homedir_v, OpType);
8511 ADD_ATTR("apple-user-homeDirectory", apple_homedir_v,
8517 homedir_v[0] = "NONE";
8518 apple_homedir_v[0] = "NONE";
8519 ADD_ATTR("homeDirectory", homedir_v, OpType);
8520 ADD_ATTR("apple-user-homeDirectory", apple_homedir_v,
8527 if ((!strcasecmp(WinHomeDir, "[afs]")) ||
8528 (!strcasecmp(WinProfileDir, "[afs]")))
8530 if (rc = moira_connect())
8532 critical_alert(whoami, "Ldap incremental",
8533 "Error contacting Moira server : %s",
8538 argv[0] = user_name;
8540 if (!(rc = mr_query("get_filesys_by_label", 1, argv, save_query_info,
8543 if(!strcmp(save_argv[FS_TYPE], "FSGROUP") ||
8544 !strcmp(save_argv[FS_TYPE], "MUL"))
8547 argv[0] = save_argv[FS_NAME];
8550 if (!(rc = mr_query("get_fsgroup_members", 1, argv,
8551 save_fsgroup_info, fsgroup_save_argv)))
8555 argv[0] = fsgroup_save_argv[0];
8557 if (!(rc = mr_query("get_filesys_by_label", 1, argv,
8558 save_query_info, save_argv)))
8560 strcpy(path, save_argv[FS_PACK]);
8567 strcpy(path, save_argv[FS_PACK]);
8575 if (!strnicmp(path, AFS, strlen(AFS)))
8577 AfsToWinAfs(path, winPath);
8578 strcpy(winProfile, winPath);
8579 strcat(winProfile, "\\.winprofile");
8586 if ((!strcasecmp(WinHomeDir, "[dfs]")) ||
8587 (!strcasecmp(WinProfileDir, "[dfs]")))
8589 sprintf(path, "\\\\%s\\dfs\\profiles\\%c\\%s", ldap_domain,
8590 user_name[0], user_name);
8592 if (!strcasecmp(WinProfileDir, "[dfs]"))
8594 strcpy(winProfile, path);
8595 strcat(winProfile, "\\.winprofile");
8598 if (!strcasecmp(WinHomeDir, "[dfs]"))
8599 strcpy(winPath, path);
8602 if (!strcasecmp(WinHomeDir, "[local]"))
8603 memset(winPath, '\0', sizeof(winPath));
8604 else if (!strcasecmp(WinHomeDir, "[afs]") ||
8605 !strcasecmp(WinHomeDir, "[dfs]"))
8607 strcpy(homeDrive, "H:");
8611 strcpy(winPath, WinHomeDir);
8612 if (!strncmp(WinHomeDir, "\\\\", 2))
8614 strcpy(homeDrive, "H:");
8618 // nothing needs to be done if WinProfileDir is [afs].
8619 if (!strcasecmp(WinProfileDir, "[local]"))
8620 memset(winProfile, '\0', sizeof(winProfile));
8621 else if (strcasecmp(WinProfileDir, "[afs]") &&
8622 strcasecmp(WinProfileDir, "[dfs]"))
8624 strcpy(winProfile, WinProfileDir);
8627 if (strlen(winProfile) != 0)
8629 if (winProfile[strlen(winProfile) - 1] == '\\')
8630 winProfile[strlen(winProfile) - 1] = '\0';
8633 if (strlen(winPath) != 0)
8635 if (winPath[strlen(winPath) - 1] == '\\')
8636 winPath[strlen(winPath) - 1] = '\0';
8639 if ((winProfile[1] == ':') && (strlen(winProfile) == 2))
8640 strcat(winProfile, "\\");
8642 if ((winPath[1] == ':') && (strlen(winPath) == 2))
8643 strcat(winPath, "\\");
8645 if (strlen(winPath) == 0)
8647 if (OpType == LDAP_MOD_REPLACE)
8650 DEL_ATTR("homeDirectory", LDAP_MOD_DELETE);
8652 //unset homeDirectory attribute for user.
8653 rc = ldap_modify_s(ldap_handle, DistinguishedName, DelMods);
8659 homedir_v[0] = strdup(winPath);
8660 ADD_ATTR("homeDirectory", homedir_v, OpType);
8663 if (strlen(winProfile) == 0)
8665 if (OpType == LDAP_MOD_REPLACE)
8668 DEL_ATTR("profilePath", LDAP_MOD_DELETE);
8670 //unset profilePate attribute for user.
8671 rc = ldap_modify_s(ldap_handle, DistinguishedName, DelMods);
8677 winProfile_v[0] = strdup(winProfile);
8678 ADD_ATTR("profilePath", winProfile_v, OpType);
8681 if (strlen(homeDrive) == 0)
8683 if (OpType == LDAP_MOD_REPLACE)
8686 DEL_ATTR("homeDrive", LDAP_MOD_DELETE);
8688 //unset homeDrive attribute for user
8689 rc = ldap_modify_s(ldap_handle, DistinguishedName, DelMods);
8695 drives_v[0] = strdup(homeDrive);
8696 ADD_ATTR("homeDrive", drives_v, OpType);
8702 int attribute_update(LDAP *ldap_handle, char *distinguished_name,
8703 char *attribute_value, char *attribute, char *user_name)
8705 char *mod_v[] = {NULL, NULL};
8706 LDAPMod *DelMods[20];
8712 if (strlen(attribute_value) == 0)
8715 DEL_ATTR(attribute, LDAP_MOD_DELETE);
8717 rc = ldap_modify_s(ldap_handle, distinguished_name, DelMods);
8723 mod_v[0] = attribute_value;
8724 ADD_ATTR(attribute, mod_v, LDAP_MOD_REPLACE);
8727 if ((rc = ldap_modify_s(ldap_handle, distinguished_name,
8728 mods)) != LDAP_SUCCESS)
8732 mod_v[0] = attribute_value;
8733 ADD_ATTR(attribute, mod_v, LDAP_MOD_ADD);
8736 if ((rc = ldap_modify_s(ldap_handle, distinguished_name,
8737 mods)) != LDAP_SUCCESS)
8739 com_err(whoami, 0, "Unable to change the %s attribute for %s "
8740 "in the directory : %s",
8741 attribute, user_name, ldap_err2string(rc));
8751 void StringTrim(char *StringToTrim)
8756 save = strdup(StringToTrim);
8763 /* skip to end of string */
8768 strcpy(StringToTrim, save);
8772 for (t = s; *t; t++)
8788 strcpy(StringToTrim, s);
8792 int ReadConfigFile(char *DomainName)
8803 sprintf(temp, "%s%s.cfg", CFG_PATH, DomainName);
8805 if ((fptr = fopen(temp, "r")) != NULL)
8807 while (fgets(temp, sizeof(temp), fptr) != 0)
8809 for (i = 0; i < (int)strlen(temp); i++)
8810 temp[i] = toupper(temp[i]);
8812 if (temp[strlen(temp) - 1] == '\n')
8813 temp[strlen(temp) - 1] = '\0';
8817 if (strlen(temp) == 0)
8820 if (!strncmp(temp, DOMAIN, strlen(DOMAIN)))
8822 if (strlen(temp) > (strlen(DOMAIN)))
8824 strcpy(ldap_domain, &temp[strlen(DOMAIN)]);
8825 StringTrim(ldap_domain);
8828 else if (!strncmp(temp, REALM, strlen(REALM)))
8830 if (strlen(temp) > (strlen(REALM)))
8832 strcpy(ldap_realm, &temp[strlen(REALM)]);
8833 StringTrim(ldap_realm);
8836 else if (!strncmp(temp, PORT, strlen(PORT)))
8838 if (strlen(temp) > (strlen(PORT)))
8840 strcpy(ldap_port, &temp[strlen(PORT)]);
8841 StringTrim(ldap_port);
8844 else if (!strncmp(temp, PRINCIPALNAME, strlen(PRINCIPALNAME)))
8846 if (strlen(temp) > (strlen(PRINCIPALNAME)))
8848 strcpy(PrincipalName, &temp[strlen(PRINCIPALNAME)]);
8849 StringTrim(PrincipalName);
8852 else if (!strncmp(temp, SERVER, strlen(SERVER)))
8854 if (strlen(temp) > (strlen(SERVER)))
8856 ServerList[Count] = calloc(1, 256);
8857 strcpy(ServerList[Count], &temp[strlen(SERVER)]);
8858 StringTrim(ServerList[Count]);
8862 else if (!strncmp(temp, MSSFU, strlen(MSSFU)))
8864 if (strlen(temp) > (strlen(MSSFU)))
8866 strcpy(temp1, &temp[strlen(MSSFU)]);
8868 if (!strcmp(temp1, SFUTYPE))
8872 else if (!strncmp(temp, GROUP_SUFFIX, strlen(GROUP_SUFFIX)))
8874 if (strlen(temp) > (strlen(GROUP_SUFFIX)))
8876 strcpy(temp1, &temp[strlen(GROUP_SUFFIX)]);
8878 if (!strcasecmp(temp1, "NO"))
8881 memset(group_suffix, '\0', sizeof(group_suffix));
8885 else if (!strncmp(temp, GROUP_TYPE, strlen(GROUP_TYPE)))
8887 if (strlen(temp) > (strlen(GROUP_TYPE)))
8889 strcpy(temp1, &temp[strlen(GROUP_TYPE)]);
8891 if (!strcasecmp(temp1, "UNIVERSAL"))
8892 UseGroupUniversal = 1;
8895 else if (!strncmp(temp, SET_GROUP_ACE, strlen(SET_GROUP_ACE)))
8897 if (strlen(temp) > (strlen(SET_GROUP_ACE)))
8899 strcpy(temp1, &temp[strlen(SET_GROUP_ACE)]);
8901 if (!strcasecmp(temp1, "NO"))
8905 else if (!strncmp(temp, SET_PASSWORD, strlen(SET_PASSWORD)))
8907 if (strlen(temp) > (strlen(SET_PASSWORD)))
8909 strcpy(temp1, &temp[strlen(SET_PASSWORD)]);
8911 if (!strcasecmp(temp1, "NO"))
8915 else if (!strncmp(temp, EXCHANGE, strlen(EXCHANGE)))
8917 if (strlen(temp) > (strlen(EXCHANGE)))
8919 strcpy(temp1, &temp[strlen(EXCHANGE)]);
8921 if (!strcasecmp(temp1, "YES"))
8925 else if (!strncmp(temp, PROCESS_MACHINE_CONTAINER,
8926 strlen(PROCESS_MACHINE_CONTAINER)))
8928 if (strlen(temp) > (strlen(PROCESS_MACHINE_CONTAINER)))
8930 strcpy(temp1, &temp[strlen(PROCESS_MACHINE_CONTAINER)]);
8932 if (!strcasecmp(temp1, "NO"))
8933 ProcessMachineContainer = 0;
8936 else if (!strncmp(temp, ACTIVE_DIRECTORY,
8937 strlen(ACTIVE_DIRECTORY)))
8939 if (strlen(temp) > (strlen(ACTIVE_DIRECTORY)))
8941 strcpy(temp1, &temp[strlen(ACTIVE_DIRECTORY)]);
8943 if (!strcasecmp(temp1, "NO"))
8944 ActiveDirectory = 0;
8947 else if (!strncmp(temp, GROUP_POPULATE_MEMBERS,
8948 strlen(GROUP_POPULATE_MEMBERS)))
8950 if (strlen(temp) > (strlen(GROUP_POPULATE_MEMBERS)))
8952 strcpy(temp1, &temp[strlen(GROUP_POPULATE_MEMBERS)]);
8954 if (!strcasecmp(temp1, "DELETE"))
8956 GroupPopulateDelete = 1;
8960 else if (!strncmp(temp, MAX_MEMBERS, strlen(MAX_MEMBERS)))
8962 if (strlen(temp) > (strlen(MAX_MEMBERS)))
8964 strcpy(temp1, &temp[strlen(MAX_MEMBERS)]);
8966 max_group_members = atoi(temp1);
8971 if (strlen(ldap_domain) != 0)
8973 memset(ldap_domain, '\0', sizeof(ldap_domain));
8977 if (strlen(temp) != 0)
8978 strcpy(ldap_domain, temp);
8984 if (strlen(ldap_domain) == 0)
8986 strcpy(ldap_domain, DomainName);
8992 for (i = 0; i < Count; i++)
8994 if (ServerList[i] != 0)
8996 for (k = 0; k < (int)strlen(ServerList[i]); k++)
8997 ServerList[i][k] = toupper(ServerList[i][k]);
9004 int ReadDomainList()
9011 unsigned char c[11];
9012 unsigned char stuff[256];
9017 sprintf(temp, "%s%s", CFG_PATH, WINADCFG);
9019 if ((fptr = fopen(temp, "r")) != NULL)
9021 while (fgets(temp, sizeof(temp), fptr) != 0)
9023 for (i = 0; i < (int)strlen(temp); i++)
9024 temp[i] = toupper(temp[i]);
9026 if (temp[strlen(temp) - 1] == '\n')
9027 temp[strlen(temp) - 1] = '\0';
9031 if (strlen(temp) == 0)
9034 if (!strncmp(temp, DOMAIN, strlen(DOMAIN)))
9036 if (strlen(temp) > (strlen(DOMAIN)))
9038 strcpy(temp1, &temp[strlen(DOMAIN)]);
9040 strcpy(temp, temp1);
9044 strcpy(DomainNames[Count], temp);
9045 StringTrim(DomainNames[Count]);
9054 critical_alert(whoami, "incremental", "%s", "ldap.incr cannot run due to a "
9055 "configuration error in ldap.cfg");
9062 int email_isvalid(const char *address) {
9064 const char *c, *domain;
9065 static char *rfc822_specials = "()<>@,;:\\\"[]";
9067 if(address[strlen(address) - 1] == '.')
9070 /* first we validate the name portion (name@domain) */
9071 for (c = address; *c; c++) {
9072 if (*c == '\"' && (c == address || *(c - 1) == '.' || *(c - 1) ==
9077 if (*c == '\\' && (*++c == ' '))
9079 if (*c <= ' ' || *c >= 127)
9094 if (*c <= ' ' || *c >= 127)
9096 if (strchr(rfc822_specials, *c))
9100 if (c == address || *(c - 1) == '.')
9103 /* next we validate the domain portion (name@domain) */
9104 if (!*(domain = ++c)) return 0;
9107 if (c == domain || *(c - 1) == '.')
9111 if (*c <= ' ' || *c >= 127)
9113 if (strchr(rfc822_specials, *c))
9117 return (count >= 1);
9120 int find_homeMDB(LDAP *ldap_handle, char *dn_path, char **homeMDB,
9121 char **homeServerName)
9123 LK_ENTRY *group_base;
9124 LK_ENTRY *sub_group_base;
9128 int sub_group_count;
9130 char sub_filter[1024];
9131 char search_path[1024];
9133 char *attr_array[3];
9135 int homeMDB_count = -1;
9139 int rangeStep = 1500;
9141 int rangeHigh = rangeLow + (rangeStep - 1);
9144 /* Grumble..... microsoft not making it searchable from the root *grr* */
9146 memset(filter, '\0', sizeof(filter));
9147 memset(search_path, '\0', sizeof(search_path));
9149 sprintf(filter, "(objectClass=msExchMDB)");
9150 sprintf(search_path, "CN=Configuration,%s", dn_path);
9151 attr_array[0] = "distinguishedName";
9152 attr_array[1] = NULL;
9157 if ((rc = linklist_build(ldap_handle, search_path, filter, attr_array,
9158 &group_base, &group_count,
9159 LDAP_SCOPE_SUBTREE)) != 0)
9161 com_err(whoami, 0, "Unable to find msExchMDB %s",
9162 ldap_err2string(rc));
9171 if (((s = strstr(gPtr->dn, "Public")) != (char *) NULL) ||
9172 ((s = strstr(gPtr->dn, "Recover")) != (char *) NULL) ||
9173 ((s = strstr(gPtr->dn, "Reserve")) != (char *) NULL))
9180 * Due to limits in active directory we need to use the LDAP
9181 * range semantics to query and return all the values in
9182 * large lists, we will stop increasing the range when
9183 * the result count is 0.
9191 memset(sub_filter, '\0', sizeof(sub_filter));
9192 memset(range, '\0', sizeof(range));
9193 sprintf(sub_filter, "(objectClass=msExchMDB)");
9196 sprintf(range, "homeMDBBL;Range=%d-*", rangeLow);
9198 sprintf(range, "homeMDBBL;Range=%d-%d", rangeLow, rangeHigh);
9200 attr_array[0] = range;
9201 attr_array[1] = NULL;
9203 sub_group_base = NULL;
9204 sub_group_count = 0;
9206 if ((rc = linklist_build(ldap_handle, gPtr->dn, sub_filter,
9207 attr_array, &sub_group_base,
9209 LDAP_SCOPE_SUBTREE)) != 0)
9211 com_err(whoami, 0, "Unable to find homeMDBBL %s",
9212 ldap_err2string(rc));
9216 if(!sub_group_count)
9222 rangeHigh = rangeLow + (rangeStep - 1);
9229 mdbbl_count += sub_group_count;
9230 rangeLow = rangeHigh + 1;
9231 rangeHigh = rangeLow + (rangeStep - 1);
9234 /* First time through, need to initialize or update the least used */
9236 com_err(whoami, 0, "Mail store %s, count %d", gPtr->dn,
9239 if(mdbbl_count < homeMDB_count || homeMDB_count == -1)
9241 homeMDB_count = mdbbl_count;
9242 *homeMDB = strdup(gPtr->dn);
9246 linklist_free(sub_group_base);
9250 linklist_free(group_base);
9253 * Ok found the server least allocated need to now query to get its
9254 * msExchHomeServerName so we can set it as a user attribute
9257 attr_array[0] = "legacyExchangeDN";
9258 attr_array[1] = NULL;
9263 if ((rc = linklist_build(ldap_handle, *homeMDB, filter,
9264 attr_array, &group_base,
9266 LDAP_SCOPE_SUBTREE)) != 0)
9268 com_err(whoami, 0, "Unable to find msExchHomeServerName %s",
9269 ldap_err2string(rc));
9275 *homeServerName = strdup(group_base->value);
9276 if((s = strrchr(*homeServerName, '/')) != (char *) NULL)
9282 linklist_free(group_base);
9287 char *lowercase(char *s)
9291 for (p = s; *p; p++)
9299 char *uppercase(char *s)
9303 for (p = s; *p; p++)
9311 char *escape_string(char *s)
9319 if(ActiveDirectory) {
9323 memset(string, '\0', sizeof(string));
9327 /* Escape any special characters */
9329 for(; *q != '\0'; q++) {
9352 return strdup(string);
9355 int save_query_info(int argc, char **argv, void *hint)
9358 char **nargv = hint;
9360 for(i = 0; i < argc; i++)
9361 nargv[i] = strdup(argv[i]);
9366 int save_fsgroup_info(int argc, char **argv, void *hint)
9369 char **nargv = hint;
9373 for(i = 0; i < argc; i++)
9374 nargv[i] = strdup(argv[i]);
9382 int contains_member(LDAP *ldap_handle, char *dn_path, char *group_name,
9383 char *UserOu, char *user_name)
9385 char search_filter[1024];
9386 char *attr_array[3];
9387 LK_ENTRY *group_base;
9394 sprintf(temp, "CN=%s,%s,%s", user_name, UserOu, dn_path);
9398 if(!strcmp(UserOu, user_ou))
9399 sprintf(temp, "uid=%s,%s,%s", user_name, UserOu, dn_path);
9401 sprintf(temp, "CN=%s,%s,%s", user_name, UserOu, dn_path);
9407 sprintf(search_filter, "(&(objectClass=group)(cn=%s)(member=%s))",
9410 attr_array[0] = "mitMoiraId";
9411 attr_array[1] = NULL;
9413 if ((rc = linklist_build(ldap_handle, dn_path, search_filter,
9414 attr_array, &group_base, &group_count,
9415 LDAP_SCOPE_SUBTREE)) != 0)
9417 com_err(whoami, 0, "Unable to check group %s for membership of %s : %s",
9418 group_name, user_name, ldap_err2string(rc));
9431 linklist_free(group_base);