1 |
diff -urbN smeserver-samba-0.1.0/createlinks smeserver-samba-0.1.0-072416-update/createlinks |
2 |
--- smeserver-samba-0.1.0/createlinks 2016-07-29 20:46:38.899060240 -0700 |
3 |
+++ smeserver-samba-0.1.0-072416-update/createlinks 2016-07-29 21:31:49.086060261 -0700 |
4 |
@@ -2,54 +2,136 @@ |
5 |
|
6 |
use esmith::Build::CreateLinks qw(:all); |
7 |
|
8 |
+#==================================================== |
9 |
+#DEFAULTS |
10 |
+#==================================================== |
11 |
+my $schemaPath='/home/e-smith/files/server-resources/schema/'; |
12 |
|
13 |
-safe_symlink("../daemontools", "root/etc/rc.d/init.d/supervise/smb"); |
14 |
|
15 |
+#==================================================== |
16 |
+#SERVER-MANAGER |
17 |
+#==================================================== |
18 |
##Set server-manager links |
19 |
#my $panel = "manager"; |
20 |
#panel_link("workgroup", $panel); |
21 |
|
22 |
-##Define events that templates2expand expands smb.conf |
23 |
-templates2events("/etc/samba/smb.conf", qw( |
24 |
- provision-domain-controller |
25 |
- bootstrap-initialize-samba)); |
26 |
- |
27 |
-##Define events that templates2expand expands krb5.conf |
28 |
-templates2events("/etc/krb5.conf", qw( |
29 |
- provision-domain-controller |
30 |
- bootstrap-initialize-samba)); |
31 |
|
32 |
-##Links for provision-domain-controller event |
33 |
+#==================================================== |
34 |
+#EVENTS |
35 |
+#==================================================== |
36 |
+ |
37 |
+#---------------------------------------------------- |
38 |
+#provision-domain-controller |
39 |
+#---------------------------------------------------- |
40 |
+$event = "provision-domain-controller"; |
41 |
+ |
42 |
+#Define action links |
43 |
$event = "provision-domain-controller"; |
44 |
-event_link("adjust-samba-down", $event, "01"); |
45 |
event_link("initialize-default-databases", $event, "01"); |
46 |
event_link("provision-domain-controller", $event, "01"); |
47 |
event_link("samba-reset-defaults", $event, "02"); |
48 |
-event_link("samba-create-domain-admins", $event,"03"); |
49 |
-event_link("adjust-samba-up", $event, "50"); |
50 |
+event_link("AD-schema-modify", $event,"30"); |
51 |
+event_link("samba-create-domain-admins", $event, "60"); |
52 |
|
53 |
-##Links for user-create |
54 |
-$event = "user-create"; |
55 |
-event_link("user-create-AD", $event, "04"); |
56 |
+#Define templates2expand |
57 |
+templates2events('/etc/samba/smb.conf',$event); |
58 |
+templates2events('/etc/krb5.conf',$event); |
59 |
+templates2events($schemaPath.'extendedADAttributes.ldif',$event); |
60 |
+templates2events($schemaPath.'koozaliADClass.ldif',$event); |
61 |
+templates2events($schemaPath.'modifyADSchema.ldif',$event); |
62 |
+templates2events($schemaPath.'setupAdmins.ldif',$event); |
63 |
+ |
64 |
+#Define services2adjust |
65 |
+event_services($event, ( |
66 |
+ 'smb' => 'sighup' |
67 |
+ )); |
68 |
+ |
69 |
+#---------------------------------------------------- |
70 |
+#bootstrap-proviision-dc |
71 |
+#---------------------------------------------------- |
72 |
+$event = "bootstrap-provision-dc"; |
73 |
|
74 |
-##Links for adjust-samba event |
75 |
-$event = "adjust-samba"; |
76 |
-event_link("adjust-samba-down", $event, "20"); |
77 |
-event_link("adjust-samba-up", $event, "30"); |
78 |
- |
79 |
-##Links for bootstrap-intialize-samba event |
80 |
-$event = "bootstrap-initialize-samba"; |
81 |
-event_link("provision-domain-controller", $event, "02"); |
82 |
+#Define action links |
83 |
+event_link("provision-domain-controller", $event, "01"); |
84 |
event_link("samba-reset-defaults", $event, "02"); |
85 |
-event_link("samba-create-domain-admins", $event,"03"); |
86 |
+event_link("AD-schema-modify", $event,"30"); |
87 |
+event_link("samba-create-domain-admins", $event, "60"); |
88 |
|
89 |
+#Define templates2expand |
90 |
+templates2events('/etc/samba/smb.conf',$event); |
91 |
+templates2events('/etc/krb5.conf',$event); |
92 |
+templates2events($schemaPath.'extendedADAttributes.ldif',$event); |
93 |
+templates2events($schemaPath.'koozaliADClass.ldif',$event); |
94 |
+templates2events($schemaPath.'modifyADSchema.ldif',$event); |
95 |
+templates2events($schemaPath.'setupAdmins.ldif',$event); |
96 |
+ |
97 |
+#---------------------------------------------------- |
98 |
+#user-create |
99 |
+#---------------------------------------------------- |
100 |
+$event = "user-create"; |
101 |
+ |
102 |
+#Define action links |
103 |
+event_link("user-create-AD", $event, "04"); |
104 |
|
105 |
-##Link smb to daemontools |
106 |
+#---------------------------------------------------- |
107 |
+#group-create |
108 |
+#---------------------------------------------------- |
109 |
+$event = "group-create"; |
110 |
+ |
111 |
+#Define action links |
112 |
+event_link("group-create-AD", $event, "04"); |
113 |
+ |
114 |
+#---------------------------------------------------- |
115 |
+#post-upgrade |
116 |
+#---------------------------------------------------- |
117 |
+$event = 'post-upgrade'; |
118 |
+ |
119 |
+#Define templates2expand |
120 |
+templates2events('/etc/samba/smb.conf',$event); |
121 |
+templates2events('/etc/krb5.conf',$event); |
122 |
+templates2events($schemaPath.'extendedADAttributes.ldif',$event); |
123 |
+templates2events($schemaPath.'koozaliADClass.ldif',$event); |
124 |
+templates2events($schemaPath.'modifyADSchema.ldif',$event); |
125 |
+templates2events($schemaPath.'setupAdmins.ldif',$event); |
126 |
+ |
127 |
+#---------------------------------------------------- |
128 |
+#post-install |
129 |
+#---------------------------------------------------- |
130 |
+$event = 'post-install'; |
131 |
+ |
132 |
+#Define templates2expand |
133 |
+templates2events('/etc/samba/smb.conf',$event); |
134 |
+templates2events('/etc/krb5.conf',$event); |
135 |
+templates2events($schemaPath.'extendedADAttributes.ldif',$event); |
136 |
+templates2events($schemaPath.'koozaliADClass.ldif',$event); |
137 |
+templates2events($schemaPath.'modifyADSchema.ldif',$event); |
138 |
+templates2events($schemaPath.'setupAdmins.ldif',$event); |
139 |
+ |
140 |
+ |
141 |
+#==================================================== |
142 |
+#SERVICE SETUP |
143 |
+#==================================================== |
144 |
+#Link smb to daemontools |
145 |
safe_symlink("daemontools", "root/etc/rc.d/init.d/smb"); |
146 |
safe_symlink("/var/service/smb", "root/service/smb"); |
147 |
+safe_symlink("../daemontools", "root/etc/rc.d/init.d/supervise/smb"); |
148 |
|
149 |
##Run level links to smb service |
150 |
safe_symlink("/etc/rc.d/init.d/supervise/smb", "root/etc/rc.d/rc7.d/S91smb"); |
151 |
safe_symlink("/etc/rc.d/init.d/supervise/smb", "root/etc/rc.d/rc6.d/K35smb"); |
152 |
safe_symlink("/etc/rc.d/init.d/supervise/smb", "root/etc/rc.d/rc1.d/K35smb"); |
153 |
safe_symlink("/etc/rc.d/init.d/supervise/smb", "root/etc/rc.d/rc0.d/K35smb"); |
154 |
+ |
155 |
+#==================================================== |
156 |
+#MISC |
157 |
+#==================================================== |
158 |
+#Create template-begin files and empty config files schema templates |
159 |
+foreach (qw(extendedADAttributes.ldif |
160 |
+ koozaliADClass.ldif |
161 |
+ modifyADSchema.ldif |
162 |
+ setupAdmins.ldif)) |
163 |
+{ |
164 |
+ safe_touch("root/$schemaPath/$_"); |
165 |
+ safe_touch("root/etc/e-smith/templates/$schemaPath/$_/template-begin"); |
166 |
+} |
167 |
+ |
168 |
diff -urbN smeserver-samba-0.1.0/root/etc/e-smith/events/actions/AD-schema-modify smeserver-samba-0.1.0-072416-update/root/etc/e-smith/events/actions/AD-schema-modify |
169 |
--- smeserver-samba-0.1.0/root/etc/e-smith/events/actions/AD-schema-modify 1969-12-31 16:00:00.000000000 -0800 |
170 |
+++ smeserver-samba-0.1.0-072416-update/root/etc/e-smith/events/actions/AD-schema-modify 2016-07-05 23:31:44.000000000 -0700 |
171 |
@@ -0,0 +1,48 @@ |
172 |
+#!/usr/bin/perl -w |
173 |
+#------------------------------------------------------------ |
174 |
+#This action modifies the Active Directory with |
175 |
+#attributes specific to Koozali SME Server |
176 |
+# |
177 |
+#Copyright 2016 Koozali Foundation, Inc. |
178 |
+#06/30/2016: G.Zartman <gzartman@koozali.org> |
179 |
+# |
180 |
+#The code contained herein can be distributed under the same |
181 |
+#license as Perl |
182 |
+#------------------------------------------------------------ |
183 |
+use strict; |
184 |
+use warnings; |
185 |
+ |
186 |
+##Pull arguments |
187 |
+my $event = $ARGV [0] || 'none'; |
188 |
+ |
189 |
+##Set a few path vars to abbreviate the systems commands |
190 |
+my $ldifs = '/home/e-smith/files/server-resources/schema/'; |
191 |
+my $ad = '/var/lib/samba/private/sam.ldb'; |
192 |
+ |
193 |
+warn "Extending Active Directory:\n"; |
194 |
+ |
195 |
+##Add Attributes |
196 |
+warn "Attributes: quota and smeCustom\n"; |
197 |
+my $addAttributes = '/usr/bin/ldbadd -H ' . |
198 |
+ "$ad " . |
199 |
+ $ldifs . 'extendedADAttributes.ldif ' . |
200 |
+ '--option="dsdb:schema update allowed"=true'; |
201 |
+system ($addAttributes); |
202 |
+ |
203 |
+ |
204 |
+##Create Koozali Object Class for new attributes |
205 |
+my $addKoozaliClass = '/usr/bin/ldbadd -H ' . |
206 |
+ "$ad " . |
207 |
+ $ldifs . 'koozaliADClass.ldif ' . |
208 |
+ '--option="dsdb:schema update allowed"=true'; |
209 |
+system ($addKoozaliClass); |
210 |
+ |
211 |
+ |
212 |
+##Apply User class updates |
213 |
+warn "Attempting to register User Class\n"; |
214 |
+my $modifyUserClass = '/usr/bin/ldbmodify -H ' . |
215 |
+ "$ad " . |
216 |
+ $ldifs . 'modifyADSchema.ldif ' . |
217 |
+ '--option="dsdb:schema update allowed"=true'; |
218 |
+ |
219 |
+system ($modifyUserClass); |
220 |
diff -urbN smeserver-samba-0.1.0/root/etc/e-smith/events/actions/group-create-AD smeserver-samba-0.1.0-072416-update/root/etc/e-smith/events/actions/group-create-AD |
221 |
--- smeserver-samba-0.1.0/root/etc/e-smith/events/actions/group-create-AD 1969-12-31 16:00:00.000000000 -0800 |
222 |
+++ smeserver-samba-0.1.0-072416-update/root/etc/e-smith/events/actions/group-create-AD 2016-07-02 10:45:54.000000000 -0700 |
223 |
@@ -0,0 +1,90 @@ |
224 |
+#!/usr/bin/perl -w |
225 |
+ |
226 |
+#------------------------------------------------------------ |
227 |
+#This action creates an Active Directory group |
228 |
+# |
229 |
+#Command format: |
230 |
+# |
231 |
+# group-create-AD event username data: |
232 |
+# |
233 |
+# event : calling event name |
234 |
+# username : unique groupname |
235 |
+# data : Hash reference to user data to populate the AD |
236 |
+# with. See esmith::AD::Groups->attributes() for |
237 |
+# supported group attributes |
238 |
+# |
239 |
+# |
240 |
+#Note: This action uses the samba-tool utility to add a new |
241 |
+# group the the Active Directory. Samba-tool does not |
242 |
+# exit very gracefully if it has a problem, so this |
243 |
+# action may throw some really funky error messages |
244 |
+# |
245 |
+#Copyright 2016 Koozali Foundation, Inc. |
246 |
+#07/02/2016: G.Zartman <gzartman@koozali.org> |
247 |
+# |
248 |
+#The code contained herein can be distributed under the same |
249 |
+#license as Perl |
250 |
+# |
251 |
+#TODO |
252 |
+# |
253 |
+#------------------------------------------------------------- |
254 |
+package esmith::thisaction; |
255 |
+ |
256 |
+use strict; |
257 |
+use warnings; |
258 |
+use esmith::ConfigDB; |
259 |
+use esmith::AD::Group; |
260 |
+no warnings ('qw'); |
261 |
+ |
262 |
+use Data::Dumper; #For debugging |
263 |
+ |
264 |
+##Pull arguments |
265 |
+my $event = $ARGV [0] || ''; |
266 |
+my $groupName = $ARGV [1] || ''; |
267 |
+my $data = $ARGV [2] || ''; #Hash ref |
268 |
+ |
269 |
+die "group-create-AD error: groupname not found in action arguments\n" |
270 |
+ unless ($groupName); |
271 |
+ |
272 |
+##Check AD to see if group exists. If it already exists, then exit |
273 |
+my $ad = esmith::AD::Group->new(); |
274 |
+die "group-create-AD error: Group already exists in Active Directory.\n" |
275 |
+ if ($ad->doesGroupExist($groupName)); |
276 |
+ |
277 |
+##Validate the group data passed as hash. If nothing is passed, ignore |
278 |
+if (ref($data) eq 'HASH') { |
279 |
+ foreach my $key (keys %$data) { |
280 |
+ unless ($ad->validData->{$key}) { |
281 |
+ warn "Ignoring $key attribute for update -- Not supported.\n"; |
282 |
+ delete $data->{$key}; |
283 |
+ } |
284 |
+ } |
285 |
+} |
286 |
+ |
287 |
+##Build Active Directory group create command |
288 |
+my $adPassword = $ad->getADPass(); |
289 |
+my $addGroup = "/usr/bin/samba-tool group add $groupName " . |
290 |
+ "-U ad_admin\%$adPassword"; |
291 |
+ |
292 |
+system ($addGroup); |
293 |
+die ("Unable to add group $groupName to Active Directory\n") if ($? == -1); |
294 |
+ |
295 |
+##Make group a Posix Group |
296 |
+unless ($ad->setPosixGroup($groupName)) { |
297 |
+ warn ("Unable to set posix objectClass in AD for $groupName.\n"); |
298 |
+} |
299 |
+ |
300 |
+##Build Unix Attributes |
301 |
+my $GID = $ad->createGID($groupName) || ''; |
302 |
+my %posix = ('gidNumber' => $GID); |
303 |
+ |
304 |
+##Merge Unix Attributes with any Extended Attributes and save to AD |
305 |
+my $mergedData = \%posix; |
306 |
+if (ref($data) eq 'HASH') { |
307 |
+ $mergedData = {%posix,%$data}; |
308 |
+} |
309 |
+ |
310 |
+$ad->setManyAttr($groupName,$mergedData) || |
311 |
+ warn("Unable update attributes for group $groupName.\n"); |
312 |
+ |
313 |
+1; |
314 |
diff -urbN smeserver-samba-0.1.0/root/etc/e-smith/events/actions/provision-domain-controller smeserver-samba-0.1.0-072416-update/root/etc/e-smith/events/actions/provision-domain-controller |
315 |
--- smeserver-samba-0.1.0/root/etc/e-smith/events/actions/provision-domain-controller 2016-07-29 20:46:38.899060240 -0700 |
316 |
+++ smeserver-samba-0.1.0-072416-update/root/etc/e-smith/events/actions/provision-domain-controller 2016-07-11 01:30:48.000000000 -0700 |
317 |
@@ -3,8 +3,8 @@ |
318 |
#------------------------------------------------------------ |
319 |
#This action provisions a Samba 4 active directory domain |
320 |
# |
321 |
-#Copyright 2014 Koozali Foundation, Inc. |
322 |
-#11/15/2014: G.Zartman <gzartman@koozali.org> |
323 |
+#Copyright 2016 Koozali Foundation, Inc. |
324 |
+#07/14/2016: G.Zartman <gzartman@koozali.org> |
325 |
# |
326 |
#The code contained herein can be distributed under the same |
327 |
#license as Perl |
328 |
@@ -13,6 +13,7 @@ |
329 |
use strict; |
330 |
use warnings; |
331 |
use esmith::ConfigDB; |
332 |
+use esmith::util; |
333 |
use esmith::AD; |
334 |
|
335 |
##Pull arguments |
336 |
@@ -21,6 +22,12 @@ |
337 |
|
338 |
die 'Samba provisioning error: Missing admin password' unless ($adminPass); |
339 |
|
340 |
+##Make sure samba deamons are down |
341 |
+esmith::util::serviceControl( |
342 |
+ NAME => 'smb', |
343 |
+ ACTION => 'stop' |
344 |
+ ); |
345 |
+ |
346 |
##Pull domain name from config dbase. This is the samba realm |
347 |
my $cdb = esmith::ConfigDB->open; |
348 |
my $domainName = $cdb->get('DomainName')->value || |
349 |
@@ -29,12 +36,6 @@ |
350 |
die 'Samba provisioning error: Workgroup not defined'; |
351 |
my $realm = $workGroup . "." . $domainName; |
352 |
|
353 |
-##Bail if Samba has already been initialized |
354 |
-if ($event eq 'bootstrap-initialize-samba' && |
355 |
- $cdb->get_prop('bootstrap-console','Samba') eq 'initialized') { |
356 |
- exit(); |
357 |
-} |
358 |
- |
359 |
##Remove existing smb.conf file or the provision will error out |
360 |
unlink ('/etc/samba/smb.conf') if (-e '/etc/samba/smb.conf'); |
361 |
|
362 |
@@ -58,7 +59,7 @@ |
363 |
|
364 |
|
365 |
##Initialize Samba Domain |
366 |
-warn "Samba domain: Provisining Active Directory."; |
367 |
+warn "Samba domain: Provisioning Active Directory\n"; |
368 |
my $provision = "/usr/bin/samba-tool domain provision --server-role=dc " . |
369 |
"--domain=$workGroup " . |
370 |
"--realm=$realm " . |
371 |
@@ -91,10 +92,8 @@ |
372 |
system ($set_admin_pass); |
373 |
die "Samba domain error: Unable to SME Server admin password.\n" if ($? == -1); |
374 |
|
375 |
-##Set samba key to initialized in bootstrap-console so it doesn't initialize again |
376 |
-if ($event eq 'bootstrap-initialize-samba') { |
377 |
+##Set samba dbase key indicating Samba has been provisioned per the current configuration |
378 |
+$cdb->set_prop('smb','provisioned','yes') || |
379 |
+ warn "Unable to set provisioned property for smb dbase key"; |
380 |
|
381 |
- $cdb->set_prop('bootstrap-console','Samba','initialized') || |
382 |
- warn "Unable to set Samba key in $event"; |
383 |
-} |
384 |
1; |
385 |
diff -urbN smeserver-samba-0.1.0/root/etc/e-smith/events/actions/samba-create-domain-admins smeserver-samba-0.1.0-072416-update/root/etc/e-smith/events/actions/samba-create-domain-admins |
386 |
--- smeserver-samba-0.1.0/root/etc/e-smith/events/actions/samba-create-domain-admins 2016-07-29 20:46:38.900060240 -0700 |
387 |
+++ smeserver-samba-0.1.0-072416-update/root/etc/e-smith/events/actions/samba-create-domain-admins 2016-07-11 01:27:00.000000000 -0700 |
388 |
@@ -1,60 +1,49 @@ |
389 |
#!/usr/bin/perl -w |
390 |
#------------------------------------------------------------ |
391 |
-#This action creates standard domain administrator accounts |
392 |
-#for the SME Server |
393 |
+#This action domain administrator accounts Koozali SME |
394 |
+#Server |
395 |
# |
396 |
-#Copyright 2014 Koozali Foundation, Inc. |
397 |
-#11/15/2014: G.Zartman <gzartman@koozali.org> |
398 |
+#Copyright 2016 Koozali Foundation, Inc. |
399 |
+#06/30/2016: G.Zartman <gzartman@koozali.org> |
400 |
# |
401 |
#The code contained herein can be distributed under the same |
402 |
#license as Perl |
403 |
#------------------------------------------------------------ |
404 |
- |
405 |
- |
406 |
use strict; |
407 |
use warnings; |
408 |
use esmith::ConfigDB; |
409 |
use esmith::AD; |
410 |
|
411 |
##Pull arguments |
412 |
-my $event = $ARGV [0]; |
413 |
-my $AdminPass = $ARGV [1]; |
414 |
+my $event = $ARGV [0] || ''; |
415 |
+my $AdminPass = $ARGV [1] || ''; |
416 |
|
417 |
die 'Samba provisioning error: Missing admin password' unless ($AdminPass); |
418 |
|
419 |
-##Bail if called by bootstrap-initialize-samba and it has already been run |
420 |
-my $cdb = esmith::ConfigDB->open; |
421 |
-if ($event eq 'bootstrap-initialize-samba' && |
422 |
- $cdb->get_prop('bootstrap-console','Samba') eq 'initialized') { |
423 |
- exit(); |
424 |
-} |
425 |
- |
426 |
- |
427 |
-##Create admin and root accounts in AD and add to Domain Admin |
428 |
+##Create admin accounts in AD |
429 |
my $add_admin = "/usr/bin/samba-tool user create " . |
430 |
"admin $AdminPass " . |
431 |
"-U Administrator\%$AdminPass"; |
432 |
system ($add_admin); |
433 |
warn "Unable create admin Samba user\n" if ($? == -1); |
434 |
|
435 |
-my $add_root = "/usr/bin/samba-tool user create " . |
436 |
- "root $AdminPass " . |
437 |
- "-U Administrator\%$AdminPass"; |
438 |
-system ($add_root); |
439 |
-warn "Unable to create root Samba user\n" if ($? == -1); |
440 |
- |
441 |
-##Create ad_admin account and add it to domain admins for runtime access to acive directory |
442 |
+##Create ad_admin account for runtime access to active directory |
443 |
my $add_ad_admin = "/usr/bin/samba-tool user create " . |
444 |
"ad_admin " . esmith::AD::getADPass() . " " . |
445 |
"-U Administrator\%$AdminPass"; |
446 |
system ($add_ad_admin); |
447 |
die "Samba provisioning error: Unable to create ad_admin user in Active Directory.\n" if ($? == -1); |
448 |
|
449 |
-my $add_members = "/usr/bin/samba-tool group addmembers " . |
450 |
- "\'Domain Admins\' ". |
451 |
- "root,admin,ad_admin " . |
452 |
- "-U Administrator\%$AdminPass"; |
453 |
-system ($add_members); |
454 |
-warn "Unable to add admin and root users to Domain Admins group\n" if ($? == -1); |
455 |
+ |
456 |
+##Enumerate admin accounts and update domain admins group |
457 |
+warn "Enumerating admin accounts\n"; |
458 |
+my $ldifs = '/home/e-smith/files/server-resources/schema/'; |
459 |
+my $ad = '/var/lib/samba/private/sam.ldb'; |
460 |
+my $modifyUserClass = '/usr/bin/ldbmodify -H ' . |
461 |
+ "$ad " . |
462 |
+ $ldifs . 'setupAdmins.ldif ' . |
463 |
+ '--option="dsdb:schema update allowed"=true'; |
464 |
+ |
465 |
+system ($modifyUserClass); |
466 |
|
467 |
1; |
468 |
diff -urbN smeserver-samba-0.1.0/root/etc/e-smith/events/actions/user-create-AD smeserver-samba-0.1.0-072416-update/root/etc/e-smith/events/actions/user-create-AD |
469 |
--- smeserver-samba-0.1.0/root/etc/e-smith/events/actions/user-create-AD 2016-07-29 20:46:38.900060240 -0700 |
470 |
+++ smeserver-samba-0.1.0-072416-update/root/etc/e-smith/events/actions/user-create-AD 2016-07-02 12:44:56.000000000 -0700 |
471 |
@@ -1,19 +1,23 @@ |
472 |
#!/usr/bin/perl -w |
473 |
|
474 |
#------------------------------------------------------------ |
475 |
-#This action creates an Active Directory user given a username |
476 |
-#from the accountsDB. |
477 |
+#This action creates an Active Directory user |
478 |
# |
479 |
#Command format: |
480 |
# |
481 |
-# user-account-AD event username data: |
482 |
+# user-create-AD event username data: |
483 |
# |
484 |
# event : calling event name |
485 |
# username : unique username |
486 |
# data : Hash reference to user data to populate the AD |
487 |
# with. See the note below for |
488 |
# |
489 |
-#Copyright 2015 Koozali Foundation, Inc. |
490 |
+#Note: This action uses the samba-tool utility to add a new |
491 |
+# user the the Active Directory. Samba-tool does not exit |
492 |
+# very gracefully if it has a problem, so this action may |
493 |
+# throw some really funky error messages. |
494 |
+# |
495 |
+#Copyright 2016 Koozali Foundation, Inc. |
496 |
#06/23/2016: G.Zartman <gzartman@koozali.org> |
497 |
# |
498 |
#The code contained herein can be distributed under the same |
499 |
@@ -21,12 +25,6 @@ |
500 |
# |
501 |
#TODO |
502 |
# |
503 |
-#- We need to look at some kind of interm solution to use |
504 |
-# acccountsDB in the short term until we figure out where we are |
505 |
-# storing user data long term on SME. For now, we'll build a |
506 |
-# hash of data from the accounts dbase, but also provide a means |
507 |
-# to pass the data to this action with a hashref, which is the |
508 |
-# preferred method for AD. |
509 |
#- For the hash reference, let's scrub it with the |
510 |
# esmith::AD::User::ValidData method |
511 |
#- Consider setting the displayName attribute as well, otherwise |
512 |
@@ -48,7 +46,7 @@ |
513 |
##Pull arguments |
514 |
my $event = $ARGV [0] || ''; |
515 |
my $userName = $ARGV [1] || ''; |
516 |
-my $data = $ARGV [2] || ''; #Hash ref |
517 |
+my $data = $ARGV [2] || {}; #Hash ref |
518 |
|
519 |
die "user-create-AD error: username not found in action arguments\n" |
520 |
unless ($userName); |
521 |
@@ -111,7 +109,6 @@ |
522 |
delete $data->{'loginShell'}; |
523 |
} |
524 |
|
525 |
- |
526 |
##Create AD User |
527 |
my $adPassword = $ad->getADPass(); |
528 |
my $addUser = "/usr/bin/samba-tool user create $userName " . |
529 |
@@ -121,7 +118,7 @@ |
530 |
'--description="Koozali User:" ' . |
531 |
"-U ad_admin\%$adPassword"; |
532 |
system ($addUser); |
533 |
-die ("Unable to add user #userName to Active Directory\n") if ($? == -1); |
534 |
+die ("Unable to add user $userName to Active Directory\n") if ($? == -1); |
535 |
|
536 |
##Make user a Posix User |
537 |
unless ($ad->setPosixUser($userName)) { |
538 |
@@ -140,8 +137,7 @@ |
539 |
$mergedData = {%posix,%$data}; |
540 |
} |
541 |
|
542 |
-$ad->setManyAttr($userName,\%posix) || |
543 |
- warn("Unable update user attributes for $userName.\n"); |
544 |
- |
545 |
+$ad->setManyAttr($userName,$mergedData) || |
546 |
+ warn("Unable update attributes for user $userName.\n"); |
547 |
|
548 |
1; |
549 |
diff -urbN smeserver-samba-0.1.0/root/etc/e-smith/templates/etc/krb5.conf/20default_realm smeserver-samba-0.1.0-072416-update/root/etc/e-smith/templates/etc/krb5.conf/20default_realm |
550 |
--- smeserver-samba-0.1.0/root/etc/e-smith/templates/etc/krb5.conf/20default_realm 2014-11-19 23:32:12.000000000 -0800 |
551 |
+++ smeserver-samba-0.1.0-072416-update/root/etc/e-smith/templates/etc/krb5.conf/20default_realm 2016-06-30 22:16:57.000000000 -0700 |
552 |
@@ -1,5 +1,8 @@ |
553 |
{ |
554 |
- my $default_realm = $krb5{defaultRealm} || $DomainName; |
555 |
+ my $workgroup = $smb{Workgroup} || 'sme-server'; |
556 |
+ my $realm = $smb{realm} || $workgroup . "." . $DomainName; |
557 |
+ |
558 |
+ my $default_realm = $smb{realm} || $workgroup . "." .$DomainName; |
559 |
|
560 |
"default_realm = $default_realm"; |
561 |
} |
562 |
diff -urbN smeserver-samba-0.1.0/root/etc/e-smith/templates/etc/smb.conf/14dnsForwarder smeserver-samba-0.1.0-072416-update/root/etc/e-smith/templates/etc/smb.conf/14dnsForwarder |
563 |
--- smeserver-samba-0.1.0/root/etc/e-smith/templates/etc/smb.conf/14dnsForwarder 2014-11-19 23:32:12.000000000 -0800 |
564 |
+++ smeserver-samba-0.1.0-072416-update/root/etc/e-smith/templates/etc/smb.conf/14dnsForwarder 2016-07-27 23:05:39.298060111 -0700 |
565 |
@@ -1,5 +1,5 @@ |
566 |
{ |
567 |
- my $dns_forwarder = $smb{DNSForwarder} || '127.0.0.2'; |
568 |
+ my $dns_forwarder = $smb{DNSForwarder} || '127.0.0.4'; |
569 |
|
570 |
"dns forwarder = $dns_forwarder"; |
571 |
|
572 |
diff -urbN smeserver-samba-0.1.0/root/etc/e-smith/templates/home/e-smith/files/server-resources/schema/extendedADAttributes.ldif/00setup smeserver-samba-0.1.0-072416-update/root/etc/e-smith/templates/home/e-smith/files/server-resources/schema/extendedADAttributes.ldif/00setup |
573 |
--- smeserver-samba-0.1.0/root/etc/e-smith/templates/home/e-smith/files/server-resources/schema/extendedADAttributes.ldif/00setup 1969-12-31 16:00:00.000000000 -0800 |
574 |
+++ smeserver-samba-0.1.0-072416-update/root/etc/e-smith/templates/home/e-smith/files/server-resources/schema/extendedADAttributes.ldif/00setup 2016-07-05 20:14:38.000000000 -0700 |
575 |
@@ -0,0 +1,9 @@ |
576 |
+{my $workgroup = $smb{Workgroup} || 'sme-server'; |
577 |
+ my $domain = $DomainName || 'undefined'; |
578 |
+ |
579 |
+ my @realm_parts = (($workgroup),(split(/\./,$domain))); |
580 |
+ |
581 |
+ my @dc_parts = map {'DC=' . $_} @realm_parts; |
582 |
+ $DC = join (',',@dc_parts); |
583 |
+ $OUT = "";} |
584 |
+ |
585 |
diff -urbN smeserver-samba-0.1.0/root/etc/e-smith/templates/home/e-smith/files/server-resources/schema/extendedADAttributes.ldif/10quota smeserver-samba-0.1.0-072416-update/root/etc/e-smith/templates/home/e-smith/files/server-resources/schema/extendedADAttributes.ldif/10quota |
586 |
--- smeserver-samba-0.1.0/root/etc/e-smith/templates/home/e-smith/files/server-resources/schema/extendedADAttributes.ldif/10quota 1969-12-31 16:00:00.000000000 -0800 |
587 |
+++ smeserver-samba-0.1.0-072416-update/root/etc/e-smith/templates/home/e-smith/files/server-resources/schema/extendedADAttributes.ldif/10quota 2016-07-05 20:14:38.000000000 -0700 |
588 |
@@ -0,0 +1,12 @@ |
589 |
+dn: CN=quota,CN=Schema,CN=Configuration,{$DC} |
590 |
+objectClass: top |
591 |
+objectClass: attributeSchema |
592 |
+attributeID: 1.3.6.1.4.1.19937.1.1.1 |
593 |
+cn: quota |
594 |
+name: quota |
595 |
+ldapDisplayName: quota |
596 |
+description: User Quotas |
597 |
+attributeSyntax: 2.5.5.5 |
598 |
+oMSyntax: 22 |
599 |
+isSingleValued: TRUE |
600 |
+- |
601 |
diff -urbN smeserver-samba-0.1.0/root/etc/e-smith/templates/home/e-smith/files/server-resources/schema/extendedADAttributes.ldif/20smeCustom smeserver-samba-0.1.0-072416-update/root/etc/e-smith/templates/home/e-smith/files/server-resources/schema/extendedADAttributes.ldif/20smeCustom |
602 |
--- smeserver-samba-0.1.0/root/etc/e-smith/templates/home/e-smith/files/server-resources/schema/extendedADAttributes.ldif/20smeCustom 1969-12-31 16:00:00.000000000 -0800 |
603 |
+++ smeserver-samba-0.1.0-072416-update/root/etc/e-smith/templates/home/e-smith/files/server-resources/schema/extendedADAttributes.ldif/20smeCustom 2016-07-05 20:14:38.000000000 -0700 |
604 |
@@ -0,0 +1,15 @@ |
605 |
+ |
606 |
+ |
607 |
+dn: CN=smeCustom,CN=Schema,CN=Configuration,{$DC} |
608 |
+objectClass: top |
609 |
+objectClass: attributeSchema |
610 |
+attributeID: 1.3.6.1.4.1.19937.1.1.1 |
611 |
+cn: smeCustom |
612 |
+name: smeCustom |
613 |
+ldapDisplayName: smeCustom |
614 |
+description: Custom Property and Values for Koozali |
615 |
+attributeSyntax: 2.5.5.5 |
616 |
+oMSyntax: 22 |
617 |
+isSingleValued: FALSE |
618 |
+- |
619 |
+ |
620 |
diff -urbN smeserver-samba-0.1.0/root/etc/e-smith/templates/home/e-smith/files/server-resources/schema/koozaliADClass.ldif/00setup smeserver-samba-0.1.0-072416-update/root/etc/e-smith/templates/home/e-smith/files/server-resources/schema/koozaliADClass.ldif/00setup |
621 |
--- smeserver-samba-0.1.0/root/etc/e-smith/templates/home/e-smith/files/server-resources/schema/koozaliADClass.ldif/00setup 1969-12-31 16:00:00.000000000 -0800 |
622 |
+++ smeserver-samba-0.1.0-072416-update/root/etc/e-smith/templates/home/e-smith/files/server-resources/schema/koozaliADClass.ldif/00setup 2016-07-05 23:24:34.000000000 -0700 |
623 |
@@ -0,0 +1,9 @@ |
624 |
+{my $workgroup = $smb{Workgroup} || 'sme-server'; |
625 |
+ my $domain = $DomainName || 'undefined'; |
626 |
+ |
627 |
+ my @realm_parts = (($workgroup),(split(/\./,$domain))); |
628 |
+ |
629 |
+ my @dc_parts = map {'DC=' . $_} @realm_parts; |
630 |
+ $DC = join (',',@dc_parts); |
631 |
+ $OUT = "";} |
632 |
+ |
633 |
diff -urbN smeserver-samba-0.1.0/root/etc/e-smith/templates/home/e-smith/files/server-resources/schema/koozaliADClass.ldif/20classSchema smeserver-samba-0.1.0-072416-update/root/etc/e-smith/templates/home/e-smith/files/server-resources/schema/koozaliADClass.ldif/20classSchema |
634 |
--- smeserver-samba-0.1.0/root/etc/e-smith/templates/home/e-smith/files/server-resources/schema/koozaliADClass.ldif/20classSchema 1969-12-31 16:00:00.000000000 -0800 |
635 |
+++ smeserver-samba-0.1.0-072416-update/root/etc/e-smith/templates/home/e-smith/files/server-resources/schema/koozaliADClass.ldif/20classSchema 2016-07-11 00:54:49.000000000 -0700 |
636 |
@@ -0,0 +1,14 @@ |
637 |
+dn: CN=koozaliUser,CN=Schema,CN=Configuration,{$DC} |
638 |
+objectClass: top |
639 |
+objectClass: classSchema |
640 |
+governsID: 1.3.6.1.4.1.19937.1.2.1 |
641 |
+cn: koozaliUser |
642 |
+name: koozaliUser |
643 |
+ldapDisplayName: koozaliUser |
644 |
+subClassOf: posixAccount |
645 |
+objectClassCategory: 3 |
646 |
+mayContain: quota |
647 |
+mayContain: smeCustom |
648 |
+defaultObjectCategory: CN=koozaliUser,CN=Schema,CN=Configuration,{$DC} |
649 |
+possSuperiors: top |
650 |
+- |
651 |
diff -urbN smeserver-samba-0.1.0/root/etc/e-smith/templates/home/e-smith/files/server-resources/schema/modifyADSchema.ldif/00setup smeserver-samba-0.1.0-072416-update/root/etc/e-smith/templates/home/e-smith/files/server-resources/schema/modifyADSchema.ldif/00setup |
652 |
--- smeserver-samba-0.1.0/root/etc/e-smith/templates/home/e-smith/files/server-resources/schema/modifyADSchema.ldif/00setup 1969-12-31 16:00:00.000000000 -0800 |
653 |
+++ smeserver-samba-0.1.0-072416-update/root/etc/e-smith/templates/home/e-smith/files/server-resources/schema/modifyADSchema.ldif/00setup 2016-07-05 20:17:28.000000000 -0700 |
654 |
@@ -0,0 +1,9 @@ |
655 |
+{my $workgroup = $smb{Workgroup} || 'sme-server'; |
656 |
+ my $domain = $DomainName || 'undefined'; |
657 |
+ |
658 |
+ my @realm_parts = (($workgroup),(split(/\./,$domain))); |
659 |
+ |
660 |
+ my @dc_parts = map {'DC=' . $_} @realm_parts; |
661 |
+ $DC = join (',',@dc_parts); |
662 |
+ $OUT = "";} |
663 |
+ |
664 |
diff -urbN smeserver-samba-0.1.0/root/etc/e-smith/templates/home/e-smith/files/server-resources/schema/modifyADSchema.ldif/10updateSchema smeserver-samba-0.1.0-072416-update/root/etc/e-smith/templates/home/e-smith/files/server-resources/schema/modifyADSchema.ldif/10updateSchema |
665 |
--- smeserver-samba-0.1.0/root/etc/e-smith/templates/home/e-smith/files/server-resources/schema/modifyADSchema.ldif/10updateSchema 1969-12-31 16:00:00.000000000 -0800 |
666 |
+++ smeserver-samba-0.1.0-072416-update/root/etc/e-smith/templates/home/e-smith/files/server-resources/schema/modifyADSchema.ldif/10updateSchema 2016-07-11 00:53:56.000000000 -0700 |
667 |
@@ -0,0 +1,5 @@ |
668 |
+dn: CN=User,CN=Schema,CN=Configuration,{$DC} |
669 |
+changetype: modify |
670 |
+add: auxiliaryClass |
671 |
+auxiliaryClass: koozaliUser |
672 |
+- |
673 |
diff -urbN smeserver-samba-0.1.0/root/etc/e-smith/templates/home/e-smith/files/server-resources/schema/setupAdmins.ldif/00setup smeserver-samba-0.1.0-072416-update/root/etc/e-smith/templates/home/e-smith/files/server-resources/schema/setupAdmins.ldif/00setup |
674 |
--- smeserver-samba-0.1.0/root/etc/e-smith/templates/home/e-smith/files/server-resources/schema/setupAdmins.ldif/00setup 1969-12-31 16:00:00.000000000 -0800 |
675 |
+++ smeserver-samba-0.1.0-072416-update/root/etc/e-smith/templates/home/e-smith/files/server-resources/schema/setupAdmins.ldif/00setup 2016-07-05 19:47:46.000000000 -0700 |
676 |
@@ -0,0 +1,9 @@ |
677 |
+{my $workgroup = $smb{Workgroup} || 'sme-server'; |
678 |
+ my $domain = $DomainName || 'undefined'; |
679 |
+ |
680 |
+ my @realm_parts = (($workgroup),(split(/\./,$domain))); |
681 |
+ |
682 |
+ my @dc_parts = map {'DC=' . $_} @realm_parts; |
683 |
+ $DC = join (',',@dc_parts); |
684 |
+ $OUT = "";} |
685 |
+ |
686 |
diff -urbN smeserver-samba-0.1.0/root/etc/e-smith/templates/home/e-smith/files/server-resources/schema/setupAdmins.ldif/20setupAdmin smeserver-samba-0.1.0-072416-update/root/etc/e-smith/templates/home/e-smith/files/server-resources/schema/setupAdmins.ldif/20setupAdmin |
687 |
--- smeserver-samba-0.1.0/root/etc/e-smith/templates/home/e-smith/files/server-resources/schema/setupAdmins.ldif/20setupAdmin 1969-12-31 16:00:00.000000000 -0800 |
688 |
+++ smeserver-samba-0.1.0-072416-update/root/etc/e-smith/templates/home/e-smith/files/server-resources/schema/setupAdmins.ldif/20setupAdmin 2016-07-11 00:53:42.000000000 -0700 |
689 |
@@ -0,0 +1,20 @@ |
690 |
+ |
691 |
+dn: CN=admin,CN=Users,{$DC} |
692 |
+changetype: modify |
693 |
+add: objectClass |
694 |
+objectClass: posixAccount |
695 |
+- |
696 |
+add: objectClass |
697 |
+objectClass: koozaliUser |
698 |
+- |
699 |
+add: uidNumber |
700 |
+uidNumber: 5000 |
701 |
+- |
702 |
+add: gidNumber |
703 |
+gidNumber:513 |
704 |
+- |
705 |
+add: loginShell |
706 |
+loginShell:/sbin/e-smith/console |
707 |
+- |
708 |
+add: unixHomeDirectory |
709 |
+unixHomeDirectory: /home/e-smith |
710 |
diff -urbN smeserver-samba-0.1.0/root/etc/e-smith/templates/home/e-smith/files/server-resources/schema/setupAdmins.ldif/30setupAd_Admin smeserver-samba-0.1.0-072416-update/root/etc/e-smith/templates/home/e-smith/files/server-resources/schema/setupAdmins.ldif/30setupAd_Admin |
711 |
--- smeserver-samba-0.1.0/root/etc/e-smith/templates/home/e-smith/files/server-resources/schema/setupAdmins.ldif/30setupAd_Admin 1969-12-31 16:00:00.000000000 -0800 |
712 |
+++ smeserver-samba-0.1.0-072416-update/root/etc/e-smith/templates/home/e-smith/files/server-resources/schema/setupAdmins.ldif/30setupAd_Admin 2016-07-11 00:53:32.000000000 -0700 |
713 |
@@ -0,0 +1,21 @@ |
714 |
+ |
715 |
+ |
716 |
+dn: CN=ad_admin,CN=Users,{$DC} |
717 |
+changetype: modify |
718 |
+add: objectClass |
719 |
+objectClass: posixAccount |
720 |
+- |
721 |
+add: objectClass |
722 |
+objectClass: koozaliUser |
723 |
+- |
724 |
+add: uidNumber |
725 |
+uidNumber: 5001 |
726 |
+- |
727 |
+add: gidNumber |
728 |
+gidNumber:513 |
729 |
+- |
730 |
+add: loginShell |
731 |
+loginShell:/sbin/nologin |
732 |
+- |
733 |
+add: unixHomeDirectory |
734 |
+unixHomeDirectory: /home/e-smith |
735 |
diff -urbN smeserver-samba-0.1.0/root/etc/e-smith/templates/home/e-smith/files/server-resources/schema/setupAdmins.ldif/40updateDomainAdmins smeserver-samba-0.1.0-072416-update/root/etc/e-smith/templates/home/e-smith/files/server-resources/schema/setupAdmins.ldif/40updateDomainAdmins |
736 |
--- smeserver-samba-0.1.0/root/etc/e-smith/templates/home/e-smith/files/server-resources/schema/setupAdmins.ldif/40updateDomainAdmins 1969-12-31 16:00:00.000000000 -0800 |
737 |
+++ smeserver-samba-0.1.0-072416-update/root/etc/e-smith/templates/home/e-smith/files/server-resources/schema/setupAdmins.ldif/40updateDomainAdmins 2016-07-11 00:42:32.000000000 -0700 |
738 |
@@ -0,0 +1,9 @@ |
739 |
+ |
740 |
+dn: CN=Domain Admins,CN=Users,{$DC} |
741 |
+changetype: modify |
742 |
+- |
743 |
+add: member |
744 |
+member: CN=admin,CN=Users,DC=sme-server,DC=development,DC=com |
745 |
+- |
746 |
+add: member |
747 |
+member: CN=ad_admin,CN=Users,DC=sme-server,DC=development,DC=com |
748 |
diff -urbN smeserver-samba-0.1.0/root/usr/share/perl5/vendor_perl/esmith/AD/Group.pm smeserver-samba-0.1.0-072416-update/root/usr/share/perl5/vendor_perl/esmith/AD/Group.pm |
749 |
--- smeserver-samba-0.1.0/root/usr/share/perl5/vendor_perl/esmith/AD/Group.pm 2015-02-12 21:15:46.000000000 -0800 |
750 |
+++ smeserver-samba-0.1.0-072416-update/root/usr/share/perl5/vendor_perl/esmith/AD/Group.pm 2016-07-11 04:41:16.000000000 -0700 |
751 |
@@ -1,10 +1,10 @@ |
752 |
package esmith::AD::Group; |
753 |
|
754 |
use strict; |
755 |
-use Net::LDAP; |
756 |
+use base 'esmith::AD'; |
757 |
+use esmith::AD::User; |
758 |
no warnings ('qw'); |
759 |
|
760 |
- |
761 |
=head1 NAME |
762 |
|
763 |
esmith::AD::Group -- Sub-Class to the Koozali esmith::AD API |
764 |
@@ -14,42 +14,90 @@ |
765 |
use esmith::AD |
766 |
|
767 |
my $ad = esmith::AD->new(); |
768 |
- my @groups = $ad->groups; |
769 |
+ my @groups = $ad->listGroups; |
770 |
|
771 |
|
772 |
=head1 DESCRIPTION |
773 |
- |
774 |
-This module provides esmith::AD methods related to group management in |
775 |
-the Koozali Active Directory. Like the parent class, esmith::AD, this |
776 |
-module uses Net::LDAP to communicate with the Active Directory. Methods |
777 |
-provided in this module abstract Net::LDAP so that knowledge of this |
778 |
-module is not required. |
779 |
+This module provide esmith::AD::Group methods for management of users |
780 |
+stored in the Koozali SME Server Active Directory. These methods are |
781 |
+the preferred methods to interact with user objects in the Active |
782 |
+Directory. Many methods in this class inherit functionality from the |
783 |
+esmith::AD parent class and provide run-time binding of LDAP query |
784 |
+elements to these parent methods. Methods provided in this module |
785 |
+abstract Net::LDAP so that knowledge of this module is not required. |
786 |
|
787 |
=cut |
788 |
|
789 |
sub new { |
790 |
my ($class, %params) = @_; |
791 |
- my $queryElements = { |
792 |
+ |
793 |
+ #Define runtime LDAP query parameters |
794 |
+ my $base = { |
795 |
+ 'default' => '&(objectClass=group)(!(objectClass=computer))' |
796 |
+ }; |
797 |
+ my $set = { |
798 |
'all' => '', |
799 |
- 'builtin' => "(!(objectClass=posixAccount))", |
800 |
- 'koozali' => "(objectClass=posixAccount)", |
801 |
- 'member' => '', |
802 |
- 'noMachine' => "(!(objectClass=computer))", |
803 |
- 'object' => "&(objectClass=group)", |
804 |
+ 'builtin' => '(!(objectClass=posixAccount))', |
805 |
+ 'koozali' => '(objectClass=posixAccount)', |
806 |
'single' => '' |
807 |
}; |
808 |
- my $objectClass = ['top','group','posixAccount']; |
809 |
+ my $type = { |
810 |
+ 'posix' => ['top','group','posixAccount'] |
811 |
+ }; |
812 |
+ |
813 |
+ my $attribute = { |
814 |
+ 'default' => 'sAMAccountName', |
815 |
+ 'dn' => 'DN' |
816 |
+ }; |
817 |
my $self = { |
818 |
- 'query' => $queryElements, |
819 |
- 'objectClass' => $objectClass |
820 |
+ 'base' => $base, |
821 |
+ 'set' => $set, |
822 |
+ 'attribute' => $attribute, |
823 |
+ 'type' => $type |
824 |
}; |
825 |
|
826 |
+ #Bless parameters into the class |
827 |
bless ($self, $class); |
828 |
+ |
829 |
return ($self); |
830 |
} |
831 |
|
832 |
=head2 Methods |
833 |
|
834 |
+ |
835 |
+=head3 addUserToGroup() |
836 |
+ |
837 |
+This method adds a user to a group given a username and group name. |
838 |
+The method returns 1 of successful and 0 if something went wrong. |
839 |
+ |
840 |
+Usage: $ad->addUserToGroup('username','groupname') |
841 |
+ |
842 |
+=cut |
843 |
+ |
844 |
+sub addUserToGroup { |
845 |
+ my ($self,$user,$group) = @_; |
846 |
+ return 0 unless ($user && $group); |
847 |
+ |
848 |
+ my $ad2 = esmith::AD::User->new(); |
849 |
+ return 0 unless ($ad2->doesUserExist($user)); |
850 |
+ |
851 |
+ #Verify Group exists so we don't run a bunch of bogus AD queries. |
852 |
+ return 0 unless ($self->doesGroupExist($group)); |
853 |
+ |
854 |
+ my $groupMembers = $self->getGroupAttr($group,'member','all') || ''; |
855 |
+ unless ($groupMembers) {$groupMembers = [];} |
856 |
+ |
857 |
+ my $memberAddDN = $self->getObjectDN($user); |
858 |
+ |
859 |
+ push(@$groupMembers, $memberAddDN) |
860 |
+ unless grep{$_ == $memberAddDN} @$groupMembers; |
861 |
+ |
862 |
+ if ($self->setAttr($group,'member',$groupMembers)) {return(1);} |
863 |
+ else {return (0)} |
864 |
+ |
865 |
+} |
866 |
+ |
867 |
+ |
868 |
=head3 attributes() |
869 |
|
870 |
This method returns a list of Active Directory group attributes managed |
871 |
@@ -79,14 +127,14 @@ |
872 |
sub createGID { |
873 |
my ($self,$group) = @_; |
874 |
|
875 |
- die $self->error("Groupname not specified.\n") unless $group; |
876 |
+ return (0) unless $group; |
877 |
|
878 |
#Pull SID from the AD |
879 |
return (0) unless (my $SID = $self->getSID($group)); |
880 |
|
881 |
- #Return GID = RID + 2000 |
882 |
+ #Return GID = RID + 4000 |
883 |
my $RID = (split(/-/,$SID))[7]; |
884 |
- return($RID+2000); |
885 |
+ return($RID+4000); |
886 |
} |
887 |
|
888 |
=head3 doesGroupExist($groupname) |
889 |
@@ -102,10 +150,12 @@ |
890 |
sub doesGroupExist { |
891 |
my ($self,$group) = @_; |
892 |
|
893 |
- my @groups = $self->listGroups('all'); |
894 |
+ return 0 unless $group; |
895 |
+ |
896 |
+ my ($groupRecord) = $self->queryObjects($group); |
897 |
|
898 |
- if(grep { $group eq $_ } @groups) { return (1); } |
899 |
- else{ return(0); } |
900 |
+ if(defined $groupRecord) {return (1);} |
901 |
+ else{return(0);} |
902 |
} |
903 |
|
904 |
=head3 getGID($groupname) |
905 |
@@ -117,142 +167,154 @@ |
906 |
|
907 |
=cut |
908 |
|
909 |
-sub getGID { ##TO DO |
910 |
- my ($self,$name) = @_; |
911 |
+sub getGID { |
912 |
+ my ($self,$group)=@_; |
913 |
+ |
914 |
+ return 0 unless $group; |
915 |
+ |
916 |
+ my ($record) = $self->queryObjects($group); |
917 |
+ die $self->error("Unable to find \"$group\" in the Active Directory.\n") |
918 |
+ unless ($record); |
919 |
|
920 |
- die $self->error("Groupname not specified.\n") unless $name; |
921 |
+ my $GID = $record->get_value('gidNumber') || ''; |
922 |
|
923 |
-###FIX ME: We are now pulling the GID from the AD |
924 |
+ die $self->error("Unable to retrieve GID for $group\n") |
925 |
+ unless ($GID); |
926 |
|
927 |
- return(); |
928 |
+ return($GID); |
929 |
} |
930 |
|
931 |
-=head3 getGroupAttr($group,$attr) |
932 |
+=head3 getGroupAttr($group,$attr,$set) |
933 |
|
934 |
This method returns the value of the specified attribute for a group |
935 |
-listed in the Active Directory. |
936 |
+listed in the Active Directory. Some attributes could be multi-value |
937 |
+attributes. By default this method will return the first value of a |
938 |
+multi-value attribute in scalar contact unless you tell the method to |
939 |
+return all value. |
940 |
|
941 |
-Usage: $value = $ad->getGroupAttr('group','attribute'); |
942 |
+Usage: $single_value = $ad->getGroupAttr('group','attribute'); |
943 |
+ $multi_value_ref = $ad->getGroupAttr('group',attribute','all'); |
944 |
|
945 |
=cut |
946 |
|
947 |
sub getGroupAttr { |
948 |
|
949 |
- my($self,$group,$attr)=@_; |
950 |
+ my($self,$group,$attr,$set)=@_; |
951 |
+ |
952 |
+ return 0 unless $group; |
953 |
|
954 |
#Check that the search attribute is supported |
955 |
die $self->error("Attribute \"$attr\" not supported\n") |
956 |
unless ($self->validData->{$attr}); |
957 |
|
958 |
- #Get attribute value from the Active Directory |
959 |
- my $value = $self->getADRecord($group)->{$attr} || ''; |
960 |
- |
961 |
+ #Query AD |
962 |
+ my ($record) = $self->queryObjects($group); |
963 |
+ die $self->error("Unable to find \"$group\" in Active Directory.\n") |
964 |
+ unless ($record); |
965 |
+ |
966 |
+ #Pull attribute value single or all |
967 |
+ if ($set eq 'all') { |
968 |
+ my $valueRef = $record->get_value($attr,asref => 1) || ''; |
969 |
+ return ($valueRef); |
970 |
+ } |
971 |
+ else { |
972 |
+ my $value = $record->get_value($attr) || ''; |
973 |
return ($value); |
974 |
+ } |
975 |
} |
976 |
|
977 |
=head3 getMembers($group) |
978 |
|
979 |
-###FIX ME: Rewrite |
980 |
-This method returns a list group membersthe value of the specified attribute for a group |
981 |
-listed in the Active Directory. |
982 |
+This method returns a list of members of a specified group. The user |
983 |
+needs to be aware of what he is asking this method to report because |
984 |
+Active Directory allows nested groups (i.e., groups that are members of |
985 |
+a group). In most cases, if you ask this method for members of a group |
986 |
+designed by this API, then it will return a list of users that are members |
987 |
+of the designed group. In the future, we may add logic to delinate user |
988 |
+members versus nested group members, but for now we are going to be lazy |
989 |
+and just report what is in Active Directory. |
990 |
|
991 |
-Usage: $value = $ad->getGroupAttr('group','attribute'); |
992 |
+Usage: @group_mambers = $ad->getMembers('group_name'); |
993 |
|
994 |
=cut |
995 |
|
996 |
-sub getMembers { ##TO DO -- May want to change to just "getMembers" |
997 |
+sub getMembers { |
998 |
+ my($self,$group)=@_; |
999 |
|
1000 |
- my($self,$group,$attr)=@_; |
1001 |
+ return (0) unless $group; |
1002 |
|
1003 |
- #Check that the search attribute is supported |
1004 |
- die $self->error("Attribute \"$attr\" not supported\n") |
1005 |
- unless (grep {$attr eq $_} ($self->attributes('group'))); |
1006 |
+ #Get group members as an array ref |
1007 |
+ my $memberDN = $self->getGroupAttr($group,'member','all') || ''; |
1008 |
|
1009 |
- #Get attribute value from the Active Directory |
1010 |
- my $value = ($self->getADRecord('group',$group))->{$attr} || ''; |
1011 |
- |
1012 |
- return ($value); |
1013 |
+ #AD returns the DN for group members, so we need to generate names |
1014 |
+ my ($sam,@members); |
1015 |
+ foreach (@$memberDN) { |
1016 |
+ $sam = $self->getName($_) || ''; |
1017 |
+ push (@members,$sam) unless ($sam eq ''); |
1018 |
+ } |
1019 |
+ return (@members); |
1020 |
} |
1021 |
|
1022 |
=head3 listGroups($type) |
1023 |
|
1024 |
This method returns a list of groups based upon the type of group |
1025 |
specified as a parameter to the method. Valid types include: |
1026 |
+ |
1027 |
- builtin: Groups defined during the Active Directory |
1028 |
provisioning (e.g., Administrator); |
1029 |
- koozali: Groups defined in the Koozali API. |
1030 |
- all: All groups. |
1031 |
|
1032 |
-If the method doesn't recieve a valid type, then it will return a list |
1033 |
-of all groups in the Active Directory |
1034 |
+If the method doesn't receive a valid type, then it will return a |
1035 |
+list of all groups in the Active Directory |
1036 |
|
1037 |
+Usage: |
1038 |
+ use esmith::AD::Group; |
1039 |
+ |
1040 |
+ my $ad = esmith::AD::Group->new(); |
1041 |
+ my @groups = $ad->listGroups('buildin'); |
1042 |
=cut |
1043 |
|
1044 |
sub listGroups { |
1045 |
- my ($self, $type) = @_; |
1046 |
+ my ($self, $set) = @_; |
1047 |
|
1048 |
- return($self->listObjects($type)); |
1049 |
+ return($self->listObjects($set)); |
1050 |
} |
1051 |
|
1052 |
-=head3 queryMembers($set,$value) |
1053 |
|
1054 |
-###FIX ME: Need to rewire |
1055 |
-This method is an alias method to the esmith::AD::listObjects method. |
1056 |
-It returns a list of usernames from the Active Directory, and also |
1057 |
-subsets of users: |
1058 |
+=head3 removeUserFromGroup() |
1059 |
|
1060 |
- - builtin: Users defined during the Active Directory |
1061 |
- provisioning (e.g., Administrator); |
1062 |
- - koozali: Users defined in the Koozali API. |
1063 |
- - all: All users (default). |
1064 |
+This method removes a user from a group given a username and group name. |
1065 |
+The method returns 1 of successful and 0 if something went wrong. |
1066 |
|
1067 |
-Usage: |
1068 |
- use esmith::AD::User; |
1069 |
- my $ad = esmith::AD::User->new(); |
1070 |
- my @users = $ad->listUsers('koozali'); |
1071 |
+Usage: $ad->removeUserFromGroupp('username','groupname') |
1072 |
|
1073 |
=cut |
1074 |
|
1075 |
-sub queryMembers { |
1076 |
- my ($self,$set,$value)=@_; |
1077 |
- |
1078 |
- my $queryFilter = $self->buildQuery('member',$set,$value) || ''; |
1079 |
- |
1080 |
- return ($self->runQuery($queryFilter)); |
1081 |
-} |
1082 |
- |
1083 |
+sub removeUserFromGroup { |
1084 |
+ my ($self,$user,$group) = @_; |
1085 |
+ return 0 unless ($user && $group); |
1086 |
|
1087 |
-=head3 queryObjects($set,$value) |
1088 |
+ my $ad2 = esmith::AD::User->new(); |
1089 |
+ return 0 unless ($ad2->doesUserExist($user)); |
1090 |
|
1091 |
-###FIX ME: Need to rewire |
1092 |
-This method is an alias method to the esmith::AD::listObjects method. |
1093 |
-It returns a list of usernames from the Active Directory, and also |
1094 |
-subsets of users: |
1095 |
+ #Verify Group exists so we don't run a bunch of bogus AD queries. |
1096 |
+ return 0 unless ($self->doesGroupExist($group)); |
1097 |
|
1098 |
- - builtin: Users defined during the Active Directory |
1099 |
- provisioning (e.g., Administrator); |
1100 |
- - koozali: Users defined in the Koozali API. |
1101 |
- - all: All users (default). |
1102 |
+ my $groupMembers = $self->getGroupAttr($group,'member','all') || ''; |
1103 |
+ return (1) unless ($groupMembers); #group is empty already |
1104 |
|
1105 |
-Usage: |
1106 |
- use esmith::AD::User; |
1107 |
- my $ad = esmith::AD::User->new(); |
1108 |
- my @users = $ad->listUsers('koozali'); |
1109 |
- |
1110 |
-=cut |
1111 |
+ my $memberRemoveDN = $self->getObjectDN($user); |
1112 |
|
1113 |
-sub queryObjects { |
1114 |
- my ($self,$set,$value)=@_; |
1115 |
+ my @newMembers = grep {$_ ne $memberRemoveDN} @$groupMembers; |
1116 |
|
1117 |
- my $class = 'object'; |
1118 |
- if (defined $value) {$class = 'single'}; |
1119 |
+ if ($self->setAttr($group,'member',\@newMembers)) {return(1);} |
1120 |
+ else {return (0)} |
1121 |
|
1122 |
- my $queryFilter = $self->buildQuery($class,$set,$value) || ''; |
1123 |
- |
1124 |
- return ($self->runQuery($queryFilter)); |
1125 |
} |
1126 |
|
1127 |
-=head3 setGroupAttr($group,$attr,$value) |
1128 |
+ |
1129 |
+=head3 setGroupAttr($group,$attr,$value)** |
1130 |
|
1131 |
This method sets or modifies an attribute value for the specified |
1132 |
groupname. |
1133 |
@@ -264,24 +326,7 @@ |
1134 |
sub setGroupAttr { |
1135 |
my ($self,$group,$attr,$value) = @_; |
1136 |
|
1137 |
- if ($self->setAttr($group,{$attr=>$value})) { return(1); } |
1138 |
- else { |
1139 |
- die->error("Unable to modify \"$attr\" for groupname \"$group\".\n"); |
1140 |
- } |
1141 |
-} |
1142 |
- |
1143 |
-=head3 setGroupMembers($group,\@members) |
1144 |
- |
1145 |
-###FIX ME: NEED TO REWITE |
1146 |
-This method sets or modifies an attribute value for the specified |
1147 |
-groupname. |
1148 |
- |
1149 |
-Usage: $ad->setGroupAttr('groupname','attribute','value') |
1150 |
- |
1151 |
-=cut |
1152 |
- |
1153 |
-sub setGroupMembers { ##TO DO |
1154 |
- my ($self,$group,$attr,$value) = @_; |
1155 |
+ return 0 unless $group; |
1156 |
|
1157 |
if ($self->setAttr($group,{$attr=>$value})) { return(1); } |
1158 |
else { |
1159 |
@@ -289,9 +334,7 @@ |
1160 |
} |
1161 |
} |
1162 |
|
1163 |
- |
1164 |
- |
1165 |
-=head3 setPostixGroup ($group) |
1166 |
+=head3 setPosixGroup ($group) |
1167 |
|
1168 |
This method designates a group as a Posix Group. The Posix group type |
1169 |
represents the groups managed by Koozali and are those groups that are |
1170 |
@@ -302,9 +345,11 @@ |
1171 |
=cut |
1172 |
|
1173 |
sub setPosixGroup { |
1174 |
- my ($self,$name) = @_; |
1175 |
+ my ($self,$group) = @_; |
1176 |
+ |
1177 |
+ return 0 unless $group; |
1178 |
|
1179 |
- return($self->setPosix($name)); |
1180 |
+ return($self->setPosix($group)); |
1181 |
} |
1182 |
|
1183 |
=head3 validData() |
1184 |
@@ -319,12 +364,15 @@ |
1185 |
sub validData { |
1186 |
my $self = shift; |
1187 |
|
1188 |
- return ({}); |
1189 |
+ return ({ |
1190 |
+ 'member' => 1, |
1191 |
+ 'gidNumber' => 1 |
1192 |
+ }); |
1193 |
} |
1194 |
|
1195 |
=head1 COPYRIGHT |
1196 |
|
1197 |
-Copyright (c) 2014 Koozali Foundation, Inc. |
1198 |
+Copyright (c) 2016 Koozali Foundation, Inc. |
1199 |
This program is free software; you can redistribute it and/or modify it |
1200 |
under the same terms as Perl itself. |
1201 |
|
1202 |
diff -urbN smeserver-samba-0.1.0/root/usr/share/perl5/vendor_perl/esmith/AD/User.pm smeserver-samba-0.1.0-072416-update/root/usr/share/perl5/vendor_perl/esmith/AD/User.pm |
1203 |
--- smeserver-samba-0.1.0/root/usr/share/perl5/vendor_perl/esmith/AD/User.pm 2016-07-29 20:46:38.901060240 -0700 |
1204 |
+++ smeserver-samba-0.1.0-072416-update/root/usr/share/perl5/vendor_perl/esmith/AD/User.pm 2016-07-11 04:35:26.000000000 -0700 |
1205 |
@@ -15,6 +15,7 @@ |
1206 |
my $ad = esmith::AD::User->new(); |
1207 |
my @users = $ad->listUsers; |
1208 |
|
1209 |
+ |
1210 |
=head1 DESCRIPTION |
1211 |
|
1212 |
This module provide esmith::AD::User methods for management of users stored |
1213 |
@@ -41,7 +42,7 @@ |
1214 |
}; |
1215 |
my $type = { |
1216 |
'posix' => ['top','person','organizationalPerson', |
1217 |
- 'user','posixAccount'] |
1218 |
+ 'user','posixAccount','koozali'] |
1219 |
}; |
1220 |
|
1221 |
my $attribute = { |
1222 |
@@ -80,8 +81,53 @@ |
1223 |
return (keys %dataHash); |
1224 |
} |
1225 |
|
1226 |
+=head3 createAutoPseudonyms($username) |
1227 |
+ |
1228 |
+This method creates dot and bar pseudonyms for a user and then |
1229 |
+adds them as an attribute to the user object. |
1230 |
+ |
1231 |
+Usage: my $uid = $ad->createAutoPseudonyms($username); |
1232 |
+ |
1233 |
+=cut |
1234 |
+ |
1235 |
+sub createAutoPseudonyms { |
1236 |
+ my ($self,$user) = @_; |
1237 |
+ |
1238 |
+ return 0 unless $user; |
1239 |
+ |
1240 |
+ #Query AD |
1241 |
+ my ($record) = $self->queryObjects($user); |
1242 |
+ die $self->error("Unable to find \"$user\" in the Active Directory.\n") |
1243 |
+ unless ($record); |
1244 |
+ |
1245 |
+ #Pull first and last name. Exit if either isn't set, as we can't |
1246 |
+ #build a pseudonym without both. |
1247 |
+ my $firstName = $record->get_value('givenName') || ''; |
1248 |
+ my $lastName = $record->get_value('sn') || ''; |
1249 |
+ return (0) if ($firstName eq '' || $lastName eq ''); |
1250 |
+ |
1251 |
+ #Get ProxyAddresses attribute as list reference or create it |
1252 |
+ my $proxyAddresses = $record->get_value('proxyAddresses'); |
1253 |
+ unless (ref($proxyAddresses) eq 'ARRAY') {$proxyAddresses = [];} |
1254 |
+ |
1255 |
+ my $dotPseudonym = 'sme:' . $firstName . '.' . $lastName; |
1256 |
+ push(@$proxyAddresses, $dotPseudonym) |
1257 |
+ unless grep{$_ eq $dotPseudonym} @$proxyAddresses; |
1258 |
+ |
1259 |
+ my $barPseudonym = 'sme:' . $firstName . '_' . $lastName; |
1260 |
+ push(@$proxyAddresses, $barPseudonym) |
1261 |
+ unless grep{$_ eq $barPseudonym} @$proxyAddresses; |
1262 |
+ |
1263 |
+ |
1264 |
+ foreach (@$proxyAddresses) {print $_ . "\n";} |
1265 |
+ if ($self->setAttr($user,'proxyAddresses',$proxyAddresses)) { |
1266 |
+ return(1); |
1267 |
+ } |
1268 |
+ else {print "had a problem"; return (0)} |
1269 |
+} |
1270 |
+ |
1271 |
|
1272 |
-=head3 createUID($name)* |
1273 |
+=head3 createUID($username) |
1274 |
|
1275 |
This method calculates a unix UID for an Active Directory user |
1276 |
based upon the SID for the Active Directory object. |
1277 |
@@ -93,18 +139,17 @@ |
1278 |
sub createUID { |
1279 |
my ($self,$name) = @_; |
1280 |
|
1281 |
- die $self->error("Username not specified in createUID method.\n") |
1282 |
- unless $name; |
1283 |
+ return 0 unless $name; |
1284 |
|
1285 |
#Pull SID from the AD |
1286 |
return (0) unless (my $SID = $self->getSID($name)); |
1287 |
|
1288 |
- #Return UID = RID + 2000 |
1289 |
+ #Return UID = RID + 4000 |
1290 |
my $RID = (split(/-/,$SID))[7]; |
1291 |
- return($RID+2000); |
1292 |
+ return($RID+4000); |
1293 |
} |
1294 |
|
1295 |
-=head3 doesUserExist($username)* |
1296 |
+=head3 doesUserExist($username) |
1297 |
|
1298 |
This method checks the Active Directory for the existance of a username passed |
1299 |
as a parameter to the method. The method returns 1 if the username exists in |
1300 |
@@ -117,75 +162,110 @@ |
1301 |
sub doesUserExist { |
1302 |
my ($self,$user) = @_; |
1303 |
|
1304 |
+ return 0 unless $user; |
1305 |
+ |
1306 |
my ($userRecord) = $self->queryObjects($user); |
1307 |
|
1308 |
if (defined $userRecord) {return(1);} |
1309 |
else {return(0);} |
1310 |
} |
1311 |
|
1312 |
+ |
1313 |
=head3 getUID($username) |
1314 |
|
1315 |
This method returns the unix UID for a user from the Active Directory. |
1316 |
|
1317 |
-Usage: my $uid = $ad->UID('username'); |
1318 |
+Usage: my $uid = $ad->getUID('username'); |
1319 |
|
1320 |
=cut |
1321 |
|
1322 |
sub getUID { |
1323 |
my ($self,$user)=@_; |
1324 |
|
1325 |
-###FIX ME: Pull UID from AD instead of calculating it. |
1326 |
+ return 0 unless $user; |
1327 |
+ |
1328 |
+ my ($record) = $self->queryObjects($user); |
1329 |
+ |
1330 |
+ die $self->error("Unable to find \"$user\" in the Active Directory.\n") |
1331 |
+ unless ($record); |
1332 |
+ |
1333 |
+ my $UID = $record->get_value('uidNumber') || ''; |
1334 |
+ |
1335 |
+ die $self->error("Unable to retrieve UID for $user\n") |
1336 |
+ unless ($UID); |
1337 |
|
1338 |
- return(); |
1339 |
+ return($UID); |
1340 |
} |
1341 |
|
1342 |
-=head3 getUserAttr($username,$attr) |
1343 |
+=head3 getUserAttr($username,$attr,$set) |
1344 |
|
1345 |
This method returns the value of the specified attribute for a user |
1346 |
-listed in the Active Directory. |
1347 |
+listed in the Active Directory. Some attributes could be multi-value |
1348 |
+attributes. By default this method will return the first value of a |
1349 |
+multi-value attribute in scalar contact unless you tell the method to |
1350 |
+return all values. If all values are specified, this method returns |
1351 |
+an array reference to the list of values. |
1352 |
|
1353 |
-Usage: $value = $ad->getUserAttr('username','attribute'); |
1354 |
+Usage: $single_value = $ad->getUserAttr('username','attribute'); |
1355 |
+ $multi_ref = $ad->getGroupAttr('username','attribute','all); |
1356 |
|
1357 |
=cut |
1358 |
|
1359 |
sub getUserAttr { |
1360 |
|
1361 |
- my($self,$username,$attr)=@_; |
1362 |
+ my($self,$user,$attr,$set)=@_; |
1363 |
+ |
1364 |
+ return 0 unless $user; |
1365 |
|
1366 |
##Check that the search attribute is supported |
1367 |
die $self->error("Attribute \"$attr\" not supported.\n") |
1368 |
- unless (grep {$attr eq $_} ($self->attributes('user'))); |
1369 |
+ unless ($self->attributes($attr)); |
1370 |
+ |
1371 |
+ ##Query AD |
1372 |
+ my ($record) = $self->queryObjects($user); |
1373 |
+ die $self->error("Unable to find \"$user\" in the Active Directory.\n") |
1374 |
+ unless ($record); |
1375 |
|
1376 |
- #Get attribute value from the Active Directory |
1377 |
- my $value = ($self->getADRecord($username))->{$attr} || ''; |
1378 |
+ #Pull attribute value single or all |
1379 |
+ if ($set eq 'all') { |
1380 |
+ my $valueRef = $record->get_value($attr) || ''; |
1381 |
+ if (ref ($valueRef) eq "ARRAY") {return($valueRef);} |
1382 |
+ else {return([$valueRef]);} |
1383 |
+ } |
1384 |
+ else { |
1385 |
+ my $value = $record->get_value($attr) || ''; |
1386 |
return ($value); |
1387 |
+ } |
1388 |
} |
1389 |
|
1390 |
+ |
1391 |
=head3 getUserGroups($username) |
1392 |
|
1393 |
-This method returns a list of the Active Directory groups that a user |
1394 |
-is a member of. |
1395 |
+This returns a list of groups the user is a member of. |
1396 |
|
1397 |
-Usage: @ad_groups=$ad->getUserGroups('username'); |
1398 |
+Usage: @user_groups = $ad->getUserGroups('username'); |
1399 |
|
1400 |
=cut |
1401 |
|
1402 |
-sub getUserGroups { ##TO DO |
1403 |
- my ($self,$user) = @_; |
1404 |
+sub getUserGroups { |
1405 |
+ my($self,$user)=@_; |
1406 |
|
1407 |
- #Lookup entry in the active directory |
1408 |
- my ($record) = $self->query('user',$user); |
1409 |
+ return (0) unless $user; |
1410 |
|
1411 |
- die $self->error("Unable to find \"$user\" in the Active Directory.\n") |
1412 |
- unless ($record); |
1413 |
+ #Get getups |
1414 |
+ my $memberDN = $self->getUserAttr($user,'memberOf','all') || ''; |
1415 |
|
1416 |
- #Get memberOf values from AD record object |
1417 |
- my @results = $record->get_value('memberOf'); |
1418 |
- |
1419 |
- return (map {(split(/[=,]/,$_))[1]} @results); |
1420 |
+ #AD returns the DN for group members, so we need to generate names |
1421 |
+ my ($sam,@groups); |
1422 |
+ foreach (@$memberDN) { |
1423 |
+ $sam = $self->getName($_) || ''; |
1424 |
+ push (@groups,$sam) unless ($sam eq ''); |
1425 |
+ } |
1426 |
+ return (@groups); |
1427 |
} |
1428 |
|
1429 |
-=head3 getUserStatus($username)* |
1430 |
+ |
1431 |
+=head3 getUserStatus($username) |
1432 |
|
1433 |
This method returns user account status, enabled or disabled, for a |
1434 |
specified username. |
1435 |
@@ -197,12 +277,63 @@ |
1436 |
sub getUserStatus { |
1437 |
my ($self,$user)=@_; |
1438 |
|
1439 |
+ return 0 unless $user; |
1440 |
+ |
1441 |
return ($self->getStatus($user)); |
1442 |
} |
1443 |
|
1444 |
-=head3 listUsers($set)* |
1445 |
|
1446 |
-This method returns a list of usernames in the active directory |
1447 |
+=head3 isUserInGroup($username,$group) |
1448 |
+ |
1449 |
+This method returns true a user exists in a group, otherwise it returns |
1450 |
+false. |
1451 |
+ |
1452 |
+Usage: $is_user_in_group = $ad->isUserInGroup('username','groupname'); |
1453 |
+ |
1454 |
+=cut |
1455 |
+ |
1456 |
+sub isUserInGroup { |
1457 |
+ my ($self,$user,$group)=@_; |
1458 |
+ |
1459 |
+ return (0) unless ($user && $group); |
1460 |
+ |
1461 |
+ #my @groups = $self->getUserGroups('root'); |
1462 |
+ |
1463 |
+ my @groups = $self->getUserGroups($user); |
1464 |
+ |
1465 |
+ if (grep {$_ eq $group} @groups) {return(1);} |
1466 |
+ else {return(0);} |
1467 |
+} |
1468 |
+ |
1469 |
+=head3 listPseudonyms |
1470 |
+ |
1471 |
+This method returns a list all Koozali User pseudonyms in the Active Directory |
1472 |
+including the admin account. |
1473 |
+ |
1474 |
+Usage: my @pseudonyms = $ad->listPseudonyms(); |
1475 |
+ |
1476 |
+=cut |
1477 |
+ |
1478 |
+sub listPseudonyms { |
1479 |
+ |
1480 |
+my ($self) = @_; |
1481 |
+ |
1482 |
+ #Pull all Koozali accounts |
1483 |
+ my @adRecords = $self->queryObjects('koozali'); |
1484 |
+ |
1485 |
+ my (@proxyAddresses, @pseudonyms) = (); |
1486 |
+ foreach (@adRecords) { |
1487 |
+ @proxyAddresses = $_->get_value('proxyAddresses'); |
1488 |
+ push(@pseudonyms, (grep(!/sme/,(map{split/:/,$_}@proxyAddresses)))); |
1489 |
+ @proxyAddresses = (); |
1490 |
+ } |
1491 |
+ return(@pseudonyms); |
1492 |
+} |
1493 |
+ |
1494 |
+ |
1495 |
+=head3 listUsers($set) |
1496 |
+ |
1497 |
+This method returns a list of usernames in the Active Directory |
1498 |
depending upon the search set sent to the method. Valid search |
1499 |
sets include: |
1500 |
|
1501 |
@@ -224,7 +355,7 @@ |
1502 |
return($self->listObjects($set)); |
1503 |
} |
1504 |
|
1505 |
-=head3 setPosixUser($user) * |
1506 |
+=head3 setPosixUser($user) |
1507 |
|
1508 |
This method designates a user as a Posix User. The Posix user type |
1509 |
represents the users managed by Koozali and displayed in the |
1510 |
@@ -239,55 +370,9 @@ |
1511 |
sub setPosixUser { |
1512 |
my ($self,$name) = @_; |
1513 |
|
1514 |
- return($self->setPosix($name)); |
1515 |
-} |
1516 |
- |
1517 |
- |
1518 |
-=head3 setUserGroups($username,$groupRef) |
1519 |
- |
1520 |
-This mthod sets the groups that a user is a member of give the username |
1521 |
-and an array reference to the group names a user is a member of. |
1522 |
- |
1523 |
-=cut |
1524 |
- |
1525 |
-sub setUserGroups {###TO DO |
1526 |
- my ($self,$name,$groupRef) = @_; |
1527 |
+ return 0 unless $name; |
1528 |
|
1529 |
- #Check input parameters |
1530 |
- die $self->error("Username not specified.\n") unless ($name); |
1531 |
- die $self->error("List of user groups not specified for $name\n") |
1532 |
- unless (ref($groupRef) eq 'ARRAY'); |
1533 |
- |
1534 |
- my @groups = @$groupRef; |
1535 |
- |
1536 |
- #Verify that groups exist in the AD |
1537 |
- |
1538 |
- #Call connect as we'll need this Net::LDAP object later |
1539 |
- my $ad = $self->connect(); |
1540 |
- |
1541 |
- #Query AD using Net::LDAP syntax, as we called connect |
1542 |
- my $query=$ad->search( |
1543 |
- base => 'DC=domain,DC=com', |
1544 |
- filter => "&(cn=$name)(objectClass=user)" |
1545 |
- ); |
1546 |
- if($query->code()) { |
1547 |
- die $self->error("Active Directory query error: ") . |
1548 |
- ($query->server_error); |
1549 |
- } |
1550 |
- die $self->error("Unable to query \"$name\" from the Active Directory.\n") |
1551 |
- unless (my $entry = $query->entry()); |
1552 |
- |
1553 |
- #Modify Active Directory record and return true if successful, else die |
1554 |
- #with error message from the Active Directory if update failed |
1555 |
- |
1556 |
- #$entry->replace(%dataHash); |
1557 |
- my $result = $entry->update($ad); |
1558 |
- |
1559 |
- if($result->code()) { |
1560 |
- die $self->error("Could not update \"$name\": ") . |
1561 |
- ($result->server_error); |
1562 |
- } |
1563 |
- return (1); |
1564 |
+ return($self->setPosix($name)); |
1565 |
} |
1566 |
|
1567 |
=head3 validData() |
1568 |
@@ -316,11 +401,13 @@ |
1569 |
'mail' => 1, |
1570 |
'name' => 1, |
1571 |
'physicalDeliveryOfficeName' => 1, |
1572 |
+ 'proxyAddresses' => 1, |
1573 |
'sn' => 1, |
1574 |
'telephoneNumber' => 1, |
1575 |
'title' => 1, |
1576 |
'uidNumber' => 1, |
1577 |
'unixHomeDirectory' => 1, |
1578 |
+ 'quota' => 1, |
1579 |
'wWWHomePage' => 1 |
1580 |
}); |
1581 |
} |
1582 |
diff -urbN smeserver-samba-0.1.0/root/usr/share/perl5/vendor_perl/esmith/AD.pm smeserver-samba-0.1.0-072416-update/root/usr/share/perl5/vendor_perl/esmith/AD.pm |
1583 |
--- smeserver-samba-0.1.0/root/usr/share/perl5/vendor_perl/esmith/AD.pm 2016-07-29 20:46:38.902060240 -0700 |
1584 |
+++ smeserver-samba-0.1.0-072416-update/root/usr/share/perl5/vendor_perl/esmith/AD.pm 2016-07-25 18:10:03.000000000 -0700 |
1585 |
@@ -4,7 +4,6 @@ |
1586 |
use Net::LDAP; |
1587 |
use MIME::Base64(); |
1588 |
use esmith::ConfigDB; |
1589 |
-use esmith::AccountsDB; |
1590 |
|
1591 |
#This package is to aid in debugging. Can remove |
1592 |
use Data::Dumper; |
1593 |
@@ -71,7 +70,7 @@ |
1594 |
my $user_status = $ad->getUserStatus; |
1595 |
|
1596 |
|
1597 |
-=head3 getADRecord {$name) |
1598 |
+=head3 getADRecord($name) |
1599 |
|
1600 |
This method returns a hash reference of attribute/value pairs |
1601 |
from the Active Directory for attributes supported by this method, |
1602 |
@@ -90,7 +89,7 @@ |
1603 |
die $self->error("Object name not specified.\n") unless $name; |
1604 |
|
1605 |
#Query record from AD |
1606 |
- my ($record) = $self->queryObjects('single',$name); |
1607 |
+ my ($record) = $self->queryObjects($name); |
1608 |
|
1609 |
#Verify that we found a record in the AD |
1610 |
die $self->error("Unable to find \"$name\" in the Active Directory.\n") |
1611 |
@@ -98,12 +97,34 @@ |
1612 |
|
1613 |
#Build a hash of supported attributes and values |
1614 |
my @attributes = $self->attributes; |
1615 |
+ |
1616 |
my %adRecord = map {$_ => ($record->get_value($_))||''} @attributes; |
1617 |
|
1618 |
return (\%adRecord); |
1619 |
} |
1620 |
|
1621 |
-=head3 SID($name) |
1622 |
+ |
1623 |
+=head3 getName($dn) |
1624 |
+ |
1625 |
+This method returns an object sAMAccountName given an object DN. |
1626 |
+ |
1627 |
+Usage: $sAMAccountName= = $ad->getName(DN); |
1628 |
+ |
1629 |
+=cut |
1630 |
+ |
1631 |
+sub getName { |
1632 |
+ my ($self,$dn) = @_; |
1633 |
+ |
1634 |
+ return (0) unless $dn; |
1635 |
+ |
1636 |
+ my @dnParts = split (/\,/,$dn); |
1637 |
+ my ($cn,$name) = split (/=/,$dnParts[0]); |
1638 |
+ |
1639 |
+ return ($name); |
1640 |
+} |
1641 |
+ |
1642 |
+ |
1643 |
+=head3 getSID($name) |
1644 |
|
1645 |
This method retrieves the SID for a specified Active Directory |
1646 |
object name, decrypts it, and then returns it. This method must be |
1647 |
@@ -209,27 +230,6 @@ |
1648 |
} |
1649 |
|
1650 |
|
1651 |
- |
1652 |
- |
1653 |
-=head3 queryMembers($set,$value) |
1654 |
- |
1655 |
-###FIX ME: Need to rewite POD |
1656 |
-This method is an alias method to the esmith::AD::listObjects method. |
1657 |
-It returns a list of usernames from the Active Directory, and also |
1658 |
-subsets of users: |
1659 |
- |
1660 |
-=cut |
1661 |
- |
1662 |
-sub queryMembers { |
1663 |
- my ($self,$set,$value)=@_; |
1664 |
- |
1665 |
- ##Need to rewrite this to use the queryObjectsmethod |
1666 |
- my $queryFilter = $self->BuildQuery('member',$set,$value) || ''; |
1667 |
- |
1668 |
- return ($self->runQuery($queryFilter)); |
1669 |
-} |
1670 |
- |
1671 |
- |
1672 |
=head3 queryObjects($self,$value,$attribute,$base) |
1673 |
|
1674 |
This is the primary query method for this API and returns Net::LDAP record |
1675 |
@@ -244,12 +244,13 @@ |
1676 |
|
1677 |
- all: All user account records in the active directory |
1678 |
- buildin: Builtin user account records. Example: Administrator |
1679 |
- - koozali: All user accoun records defined in this UI. These are the typical |
1680 |
+ - koozali: All user account records defined in this UI. These are the typical |
1681 |
user accounts setup in the server-manager for via the commandline. |
1682 |
|
1683 |
-To search for a single user record, set $value to the Active Directory attribute |
1684 |
-value for the record you'd like to search for. The default search attribute is |
1685 |
-the username (e.g., sAMAccountName). |
1686 |
+To search for a single, set $value to the Active Directory attribute value for |
1687 |
+the record you'd like to search for. This method will automatically runtime |
1688 |
+bind to the correct object type (i.e., users, groups, OUs, DNS). The default |
1689 |
+search attribute is the username (e.g., sAMAccountName). |
1690 |
|
1691 |
This method can also search for single records given other AD attributes, |
1692 |
but other search attributes must be defined in child classes. See child |
1693 |
@@ -294,7 +295,6 @@ |
1694 |
$searchValue = $setValue; |
1695 |
}; |
1696 |
|
1697 |
- |
1698 |
##Build Query Filter |
1699 |
my $queryFilter = $self->{'base'}->{"$base"} . |
1700 |
$self->{'set'}->{"$set"}; |
1701 |
@@ -349,19 +349,24 @@ |
1702 |
sub setManyAttr { |
1703 |
my ($self,$name,$attrRef) = @_; |
1704 |
|
1705 |
+ return 0 unless ($name && $attrRef); |
1706 |
+ |
1707 |
#Don't allow this method from this class |
1708 |
- die $self->error("Must call this method on a esmith::AD child object.\n") |
1709 |
+ die $self->error("Must call this method on a esmith::AD child object\n") |
1710 |
if (ref($self) eq 'esmith::AD'); |
1711 |
|
1712 |
#Check to make sure we have enough data to perform an update |
1713 |
- die $self->error("Entity to modify not specified.\n") unless ($name); |
1714 |
die $self->error("No attributes set to modify for $name\n") |
1715 |
unless (ref($attrRef) eq 'HASH'); |
1716 |
|
1717 |
#Validate that we support the attributes for update |
1718 |
foreach my $key (keys %$attrRef) { |
1719 |
unless ($self->validData->{$key}) { |
1720 |
- warn "Ignoring $key attribute for update -- Not supported.\n"; |
1721 |
+ warn "Ignoring $key attribute for update -- Not supported\n"; |
1722 |
+ delete $attrRef->{$key}; |
1723 |
+ } |
1724 |
+ if ($attrRef->{$key} eq '') { |
1725 |
+ warn "Ignoring $key attribute since it is blank\n"; |
1726 |
delete $attrRef->{$key}; |
1727 |
} |
1728 |
} |
1729 |
@@ -377,7 +382,7 @@ |
1730 |
return (1); |
1731 |
} |
1732 |
|
1733 |
-=head3 setPosix($type,$name) * |
1734 |
+=head3 setPosix($type,$name) |
1735 |
|
1736 |
This method designates an Active Directory object as a Posix object given |
1737 |
and object sAMAccount name (e.g., username). |
1738 |
@@ -552,12 +557,12 @@ |
1739 |
my ($self)=@_; |
1740 |
|
1741 |
my $realm = $self->realm; |
1742 |
- my @elements = split (/\./, $realm); |
1743 |
+ my @realmParts = split (/\./, $realm); |
1744 |
|
1745 |
- my $base = ''; |
1746 |
- foreach (@elements) {$base .= "DC=" . $_ . ","}; |
1747 |
+ my @dnParts = map {'DC=' . $_} @realmParts; |
1748 |
+ my $base = join (',' , @dnParts); |
1749 |
|
1750 |
- return(substr ($base,0,-1)); |
1751 |
+ return ($base); |
1752 |
} |
1753 |
|
1754 |
#------------------------------------------------------------ |
1755 |
@@ -588,6 +593,21 @@ |
1756 |
} |
1757 |
|
1758 |
#------------------------------------------------------------ |
1759 |
+#Method: getObjectDN() |
1760 |
+# This method builds and object DN for user and group |
1761 |
+# objects in the Active Directory. |
1762 |
+#----------------------------------------------------------- |
1763 |
+sub getObjectDN { |
1764 |
+ my ($self,$name)=@_; |
1765 |
+ |
1766 |
+ return 0 unless $name; |
1767 |
+ |
1768 |
+ my $base = $self->baseDN; |
1769 |
+ |
1770 |
+ return('CN=' . $name . ',' . 'CN=Users,' . $base); |
1771 |
+} |
1772 |
+ |
1773 |
+#------------------------------------------------------------ |
1774 |
#Method: realm() |
1775 |
# This method returns the realm which is the SME |
1776 |
# domain name stored in the configuration dbase |