1 |
diff -ruN e-smith-ldap-5.2.0/root/etc/e-smith/events/actions/ldap-update e-smith-ldap-5.2.0.new/root/etc/e-smith/events/actions/ldap-update |
2 |
--- e-smith-ldap-5.2.0/root/etc/e-smith/events/actions/ldap-update 2010-09-27 11:33:27.000000000 -0600 |
3 |
+++ e-smith-ldap-5.2.0.new/root/etc/e-smith/events/actions/ldap-update 2010-09-27 11:35:35.000000000 -0600 |
4 |
@@ -184,6 +184,7 @@ |
5 |
{ |
6 |
$dn = "uid=$key,ou=Users,$base"; |
7 |
} |
8 |
+ utf8::upgrade($dn); |
9 |
$updates->{$dn}->{objectClass} = ['posixAccount', 'shadowAccount']; |
10 |
|
11 |
# Read information from getent passwd |
12 |
@@ -239,6 +240,7 @@ |
13 |
# Do the group portion |
14 |
#------------------------------------------------------------ |
15 |
$dn = "cn=$key,ou=Groups,$base"; |
16 |
+ utf8::upgrade($dn); |
17 |
$updates->{$dn}->{objectClass} = ['posixGroup']; |
18 |
|
19 |
# Read information from getent group |
20 |
diff -ruN e-smith-ldap-5.2.0/root/etc/e-smith/templates/home/e-smith/db/ldap/ldif/10organisation e-smith-ldap-5.2.0.new/root/etc/e-smith/templates/home/e-smith/db/ldap/ldif/10organisation |
21 |
--- e-smith-ldap-5.2.0/root/etc/e-smith/templates/home/e-smith/db/ldap/ldif/10organisation 2010-09-27 11:33:27.000000000 -0600 |
22 |
+++ e-smith-ldap-5.2.0.new/root/etc/e-smith/templates/home/e-smith/db/ldap/ldif/10organisation 1969-12-31 17:00:00.000000000 -0700 |
23 |
@@ -1,26 +0,0 @@ |
24 |
-{ |
25 |
- my ($dc,undef) = split (/\./, $DomainName); |
26 |
- my $o = $ldap{defaultCompany} || $DomainName; |
27 |
- |
28 |
- $OUT .= "dn: $ldapBase\n"; |
29 |
- $OUT .= "dc: $dc\n"; |
30 |
- $OUT .= "o: $o\n"; |
31 |
- $OUT .= "objectClass: top\n"; |
32 |
- $OUT .= "objectClass: organization\n"; |
33 |
- $OUT .= "objectClass: dcObject\n\n"; |
34 |
- |
35 |
- $OUT .= "dn: ou=Users,$ldapBase\n"; |
36 |
- $OUT .= "ou: Users\n"; |
37 |
- $OUT .= "objectClass: top\n"; |
38 |
- $OUT .= "objectClass: organizationalUnit\n\n"; |
39 |
- |
40 |
- $OUT .= "dn: ou=Groups,$ldapBase\n"; |
41 |
- $OUT .= "ou: Groups\n"; |
42 |
- $OUT .= "objectClass: top\n"; |
43 |
- $OUT .= "objectClass: organizationalUnit\n\n"; |
44 |
- |
45 |
- $OUT .= "dn: ou=Computers,$ldapBase\n"; |
46 |
- $OUT .= "ou: Computers\n"; |
47 |
- $OUT .= "objectClass: top\n"; |
48 |
- $OUT .= "objectClass: organizationalUnit\n\n"; |
49 |
-} |
50 |
diff -ruN e-smith-ldap-5.2.0/root/etc/e-smith/templates/home/e-smith/db/ldap/ldif/20ldif e-smith-ldap-5.2.0.new/root/etc/e-smith/templates/home/e-smith/db/ldap/ldif/20ldif |
51 |
--- e-smith-ldap-5.2.0/root/etc/e-smith/templates/home/e-smith/db/ldap/ldif/20ldif 1969-12-31 17:00:00.000000000 -0700 |
52 |
+++ e-smith-ldap-5.2.0.new/root/etc/e-smith/templates/home/e-smith/db/ldap/ldif/20ldif 2010-09-27 11:07:36.000000000 -0600 |
53 |
@@ -0,0 +1,19 @@ |
54 |
+{ |
55 |
+ foreach my $dn (keys %$ldif) |
56 |
+ { |
57 |
+ $OUT .= "dn: $dn\n"; |
58 |
+ foreach my $attr ( keys %{$ldif->{$dn}} ) |
59 |
+ { |
60 |
+ if (ref($ldif->{$dn}->{$attr}) eq 'ARRAY') |
61 |
+ { |
62 |
+ my %seen = (); |
63 |
+ $OUT .= "$attr: $_\n" foreach grep { ! $seen{$_}++ } @{$ldif->{$dn}->{$attr}}; |
64 |
+ } |
65 |
+ else |
66 |
+ { |
67 |
+ $OUT .= "$attr: ".$ldif->{$dn}->{$attr}."\n" if $ldif->{$dn}->{$attr}; |
68 |
+ } |
69 |
+ } |
70 |
+ $OUT .= "\n"; |
71 |
+ } |
72 |
+} |
73 |
diff -ruN e-smith-ldap-5.2.0/root/etc/e-smith/templates/home/e-smith/db/ldap/ldif/50computers e-smith-ldap-5.2.0.new/root/etc/e-smith/templates/home/e-smith/db/ldap/ldif/50computers |
74 |
--- e-smith-ldap-5.2.0/root/etc/e-smith/templates/home/e-smith/db/ldap/ldif/50computers 2010-09-27 11:33:27.000000000 -0600 |
75 |
+++ e-smith-ldap-5.2.0.new/root/etc/e-smith/templates/home/e-smith/db/ldap/ldif/50computers 1969-12-31 17:00:00.000000000 -0700 |
76 |
@@ -1,40 +0,0 @@ |
77 |
-{ |
78 |
- foreach my $comp ($a->get_all_by_prop(type => 'machine')) |
79 |
- { |
80 |
- my $key = $comp->key; |
81 |
- |
82 |
- if (exists $users->{$key}) |
83 |
- { |
84 |
- $OUT .= "dn: uid=$key,ou=Computers,$ldapBase\n"; |
85 |
- $OUT .= "objectClass: posixAccount\n"; |
86 |
- $OUT .= "objectClass: shadowAccount\n"; |
87 |
- $OUT .= "objectClass: account\n"; |
88 |
- $OUT .= "objectClass: sambaSamAccount\n" if exists $users->{$key}->{sambaSID}; |
89 |
- foreach my $attr ( keys %{$users->{$key}} ) |
90 |
- { |
91 |
- $OUT .= utf8("$attr: ".$users->{$key}->{$attr})."\n" if $users->{$key}->{$attr}; |
92 |
- } |
93 |
- $OUT .= "\n"; |
94 |
- } |
95 |
- |
96 |
- if (exists $groups->{$key}) |
97 |
- { |
98 |
- $OUT .= "dn: cn=$key,ou=Groups,$ldapBase\n"; |
99 |
- $OUT .= "objectClass: posixGroup\n"; |
100 |
- $OUT .= "objectClass: sambaGroupMapping\n" if exists $groups->{$key}->{sambaSID}; |
101 |
- foreach my $attr ( keys %{$groups->{$key}} ) |
102 |
- { |
103 |
- if (ref($groups->{$key}->{$attr}) eq 'ARRAY') |
104 |
- { |
105 |
- my %seen = (); |
106 |
- $OUT .= utf8("$attr: $_\n") foreach (grep { ! $seen{$_}++ } @{$groups->{$key}->{$attr}}); |
107 |
- } |
108 |
- else |
109 |
- { |
110 |
- $OUT .= utf8("$attr: ".$groups->{$key}->{$attr})."\n" if $groups->{$key}->{$attr}; |
111 |
- } |
112 |
- } |
113 |
- $OUT .= "\n"; |
114 |
- } |
115 |
- } |
116 |
-} |
117 |
diff -ruN e-smith-ldap-5.2.0/root/etc/e-smith/templates/home/e-smith/db/ldap/ldif/50groups e-smith-ldap-5.2.0.new/root/etc/e-smith/templates/home/e-smith/db/ldap/ldif/50groups |
118 |
--- e-smith-ldap-5.2.0/root/etc/e-smith/templates/home/e-smith/db/ldap/ldif/50groups 2010-09-27 11:33:27.000000000 -0600 |
119 |
+++ e-smith-ldap-5.2.0.new/root/etc/e-smith/templates/home/e-smith/db/ldap/ldif/50groups 1969-12-31 17:00:00.000000000 -0700 |
120 |
@@ -1,42 +0,0 @@ |
121 |
-{ |
122 |
- foreach my $grp ($a->groups) |
123 |
- { |
124 |
- my $key = $grp->key; |
125 |
- |
126 |
- if (exists $users->{$key}) |
127 |
- { |
128 |
- $OUT .= "dn: uid=$key,ou=Users,$ldapBase\n"; |
129 |
- $OUT .= "objectClass: posixAccount\n"; |
130 |
- $OUT .= "objectClass: shadowAccount\n"; |
131 |
- $OUT .= "objectClass: account\n"; |
132 |
- $OUT .= "objectClass: sambaSamAccount\n" if exists $users->{$key}->{sambaSID}; |
133 |
- foreach my $attr ( keys %{$users->{$key}} ) |
134 |
- { |
135 |
- $OUT .= utf8("$attr: ".$users->{$key}->{$attr})."\n" if $users->{$key}->{$attr}; |
136 |
- } |
137 |
- $OUT .= "\n"; |
138 |
- } |
139 |
- |
140 |
- if (exists $groups->{$key}) |
141 |
- { |
142 |
- $OUT .= "dn: cn=$key,ou=Groups,$ldapBase\n"; |
143 |
- $OUT .= "objectClass: posixGroup\n"; |
144 |
- $OUT .= "objectClass: mailboxRelatedObject\n"; |
145 |
- $OUT .= "objectClass: sambaGroupMapping\n" if exists $groups->{$key}->{sambaSID}; |
146 |
- foreach my $attr ( keys %{$groups->{$key}} ) |
147 |
- { |
148 |
- if (ref($groups->{$key}->{$attr}) eq 'ARRAY') |
149 |
- { |
150 |
- my %seen = (); |
151 |
- $OUT .= utf8("$attr: $_\n") foreach grep { ! $seen{$_}++ } @{$groups->{$key}->{$attr}}; |
152 |
- } |
153 |
- else |
154 |
- { |
155 |
- $OUT .= utf8("$attr: ".$groups->{$key}->{$attr})."\n" if $groups->{$key}->{$attr}; |
156 |
- } |
157 |
- } |
158 |
- $OUT .= "mail: $key\@$DomainName\n"; |
159 |
- $OUT .= "\n"; |
160 |
- } |
161 |
- } |
162 |
-} |
163 |
diff -ruN e-smith-ldap-5.2.0/root/etc/e-smith/templates/home/e-smith/db/ldap/ldif/50ibays e-smith-ldap-5.2.0.new/root/etc/e-smith/templates/home/e-smith/db/ldap/ldif/50ibays |
164 |
--- e-smith-ldap-5.2.0/root/etc/e-smith/templates/home/e-smith/db/ldap/ldif/50ibays 2010-09-27 11:33:27.000000000 -0600 |
165 |
+++ e-smith-ldap-5.2.0.new/root/etc/e-smith/templates/home/e-smith/db/ldap/ldif/50ibays 1969-12-31 17:00:00.000000000 -0700 |
166 |
@@ -1,40 +0,0 @@ |
167 |
-{ |
168 |
- foreach my $ibay ($a->ibays) |
169 |
- { |
170 |
- my $key = $ibay->key; |
171 |
- |
172 |
- if (exists $users->{$key}) |
173 |
- { |
174 |
- $OUT .= "dn: uid=$key,ou=Users,$ldapBase\n"; |
175 |
- $OUT .= "objectClass: posixAccount\n"; |
176 |
- $OUT .= "objectClass: shadowAccount\n"; |
177 |
- $OUT .= "objectClass: account\n"; |
178 |
- $OUT .= "objectClass: sambaSamAccount\n" if exists $users->{$key}->{sambaSID}; |
179 |
- foreach my $attr ( keys %{$users->{$key}} ) |
180 |
- { |
181 |
- $OUT .= utf8("$attr: ".$users->{$key}->{$attr})."\n" if $users->{$key}->{$attr}; |
182 |
- } |
183 |
- $OUT .= "\n"; |
184 |
- } |
185 |
- |
186 |
- if (exists $groups->{$key}) |
187 |
- { |
188 |
- $OUT .= "dn: cn=$key,ou=Groups,$ldapBase\n"; |
189 |
- $OUT .= "objectClass: posixGroup\n"; |
190 |
- $OUT .= "objectClass: sambaGroupMapping\n" if exists $groups->{$key}->{sambaSID}; |
191 |
- foreach my $attr ( keys %{$groups->{$key}} ) |
192 |
- { |
193 |
- if (ref($groups->{$key}->{$attr}) eq 'ARRAY') |
194 |
- { |
195 |
- my %seen = (); |
196 |
- $OUT .= utf8("$attr: $_\n") foreach grep { ! $seen{$_}++ } @{$groups->{$key}->{$attr}}; |
197 |
- } |
198 |
- else |
199 |
- { |
200 |
- $OUT .= utf8("$attr: ".$groups->{$key}->{$attr})."\n" if $groups->{$key}->{$attr}; |
201 |
- } |
202 |
- } |
203 |
- $OUT .= "\n"; |
204 |
- } |
205 |
- } |
206 |
-} |
207 |
diff -ruN e-smith-ldap-5.2.0/root/etc/e-smith/templates/home/e-smith/db/ldap/ldif/50users e-smith-ldap-5.2.0.new/root/etc/e-smith/templates/home/e-smith/db/ldap/ldif/50users |
208 |
--- e-smith-ldap-5.2.0/root/etc/e-smith/templates/home/e-smith/db/ldap/ldif/50users 2010-09-27 11:33:27.000000000 -0600 |
209 |
+++ e-smith-ldap-5.2.0.new/root/etc/e-smith/templates/home/e-smith/db/ldap/ldif/50users 1969-12-31 17:00:00.000000000 -0700 |
210 |
@@ -1,43 +0,0 @@ |
211 |
-{ |
212 |
- my @users = $a->users; |
213 |
- push (@users,$a->get('admin')); |
214 |
- foreach my $user (@users) |
215 |
- { |
216 |
- my $key = $user->key; |
217 |
- |
218 |
- if (exists $users->{$key}) |
219 |
- { |
220 |
- $OUT .= "dn: uid=$key,ou=Users,$ldapBase\n"; |
221 |
- $OUT .= "objectClass: inetOrgPerson\n"; |
222 |
- $OUT .= "objectClass: posixAccount\n"; |
223 |
- $OUT .= "objectClass: shadowAccount\n"; |
224 |
- $OUT .= "objectClass: sambaSamAccount\n" if exists $users->{$key}->{sambaSID}; |
225 |
- foreach my $attr ( keys %{$users->{$key}} ) |
226 |
- { |
227 |
- $OUT .= utf8("$attr: ".$users->{$key}->{$attr})."\n" if $users->{$key}->{$attr}; |
228 |
- } |
229 |
- $OUT .= utf8("mail: $key\@$DomainName\n"); |
230 |
- $OUT .= "\n"; |
231 |
- } |
232 |
- |
233 |
- if (exists $groups->{$key}) |
234 |
- { |
235 |
- $OUT .= "dn: cn=$key,ou=Groups,$ldapBase\n"; |
236 |
- $OUT .= "objectClass: posixGroup\n"; |
237 |
- $OUT .= "objectClass: sambaGroupMapping\n" if exists $groups->{$key}->{sambaSID}; |
238 |
- foreach my $attr ( keys %{$groups->{$key}} ) |
239 |
- { |
240 |
- if (ref($groups->{$key}->{$attr}) eq 'ARRAY') |
241 |
- { |
242 |
- my %seen = (); |
243 |
- $OUT .= utf8("$attr: $_\n") foreach grep { ! $seen{$_}++ } @{$groups->{$key}->{$attr}}; |
244 |
- } |
245 |
- else |
246 |
- { |
247 |
- $OUT .= utf8("$attr: ".$groups->{$key}->{$attr})."\n" if $groups->{$key}->{$attr}; |
248 |
- } |
249 |
- } |
250 |
- $OUT .= "\n"; |
251 |
- } |
252 |
- } |
253 |
-} |
254 |
diff -ruN e-smith-ldap-5.2.0/root/etc/e-smith/templates/home/e-smith/db/ldap/ldif/template-begin e-smith-ldap-5.2.0.new/root/etc/e-smith/templates/home/e-smith/db/ldap/ldif/template-begin |
255 |
--- e-smith-ldap-5.2.0/root/etc/e-smith/templates/home/e-smith/db/ldap/ldif/template-begin 2010-09-27 11:33:27.000000000 -0600 |
256 |
+++ e-smith-ldap-5.2.0.new/root/etc/e-smith/templates/home/e-smith/db/ldap/ldif/template-begin 2010-09-27 11:34:20.000000000 -0600 |
257 |
@@ -4,86 +4,167 @@ |
258 |
use Date::Parse; |
259 |
|
260 |
my $schema = '/etc/openldap/schema/samba.schema'; |
261 |
- my $schema = '/usr/share/doc/samba-3.0.33/LDAP/samba.schema'; |
262 |
+ |
263 |
$a = esmith::AccountsDB->open_ro; |
264 |
$ldapBase = esmith::util::ldapBase ($DomainName); |
265 |
|
266 |
- sub utf8 |
267 |
+ local ($dn, $dc, $obj, $attr, $account, $type); |
268 |
+ ($dc) = split (/\./, $DomainName); |
269 |
+ |
270 |
+ $ldif = (); |
271 |
+ |
272 |
+ # Top domain object |
273 |
+ utf8::upgrade($ldapBase); |
274 |
+ $ldif->{$ldapBase}->{objectClass} = [ qw(top organization dcObject) ]; |
275 |
+ $ldif->{$ldapBase}->{dc} = $dc; |
276 |
+ $ldif->{$ldapBase}->{o} = $ldap{defaultCompany} || $DomainName; |
277 |
+ |
278 |
+ # Top level groups |
279 |
+ foreach $obj ( qw(Users Groups Computers) ) |
280 |
{ |
281 |
- my $t = shift; |
282 |
- utf8::encode($t); |
283 |
- return $t; |
284 |
+ $dn = "ou=$obj,$ldapBase"; |
285 |
+ utf8::upgrade($dn); |
286 |
+ |
287 |
+ $ldif->{$dn}->{objectClass} = [ qw(top organizationalUnit) ]; |
288 |
+ $ldif->{$dn}->{ou} = $obj; |
289 |
} |
290 |
|
291 |
- $users = (); |
292 |
+ local $dnmap = (); |
293 |
+ |
294 |
+ # Read in user details |
295 |
while(my ($key,$pwd,$uid,$gid,undef,undef,$gecos,$dir,$shell) = getpwent()) |
296 |
{ |
297 |
# skip non sme users |
298 |
- my $account = $a->get($key) || next; |
299 |
+ $account = $a->get($key) || next; |
300 |
+ $type = $account->prop('type') || 'unknown'; |
301 |
+ next unless ($type =~ m{^(?:user|group|ibay|machine)$} or $key eq 'admin'); |
302 |
+ |
303 |
+ if ($type eq 'machine') |
304 |
+ { |
305 |
+ $dn = "uid=$key,ou=Computers,$ldapBase"; |
306 |
+ utf8::upgrade($dn); |
307 |
+ } |
308 |
+ else |
309 |
+ { |
310 |
+ $dn = "uid=$key,ou=Users,$ldapBase"; |
311 |
+ utf8::upgrade($dn); |
312 |
+ } |
313 |
+ |
314 |
+ $dnmap->{$key}->{user} = $dn; |
315 |
|
316 |
- $users->{$key}->{uid} = $key; |
317 |
- $users->{$key}->{userPassword} = ($pwd =~ m/^\{/) ? $pwd : "\{CRYPT\}$pwd"; |
318 |
- $users->{$key}->{uidNumber} = $uid; |
319 |
- $users->{$key}->{gidNumber} = $gid; |
320 |
- $users->{$key}->{gecos} = $gecos; |
321 |
- $users->{$key}->{cn} = $gecos; |
322 |
- $users->{$key}->{homeDirectory} = $dir; |
323 |
- $users->{$key}->{loginShell} = $shell; |
324 |
- if (($account->prop('type') || 'unknown') eq 'user') |
325 |
- { |
326 |
- $users->{$key}->{givenName} = $account->prop('FirstName'); |
327 |
- $users->{$key}->{sn} = $account->prop('LastName'); |
328 |
- $users->{$key}->{telephoneNumber} = $account->prop('Phone'); |
329 |
- $users->{$key}->{o} = $account->prop('Company'); |
330 |
- $users->{$key}->{ou} = $account->prop('Department'); |
331 |
- $users->{$key}->{l} = $account->prop('City'); |
332 |
- $users->{$key}->{street} = $account->prop('Street'); |
333 |
+ $ldif->{$dn}->{objectClass} = [ qw(posixAccount shadowAccount) ]; |
334 |
+ $ldif->{$dn}->{uid} = $key; |
335 |
+ $ldif->{$dn}->{userPassword} = ($pwd =~ m/^\{/) ? $pwd : "\{CRYPT\}$pwd"; |
336 |
+ $ldif->{$dn}->{uidNumber} = $uid; |
337 |
+ $ldif->{$dn}->{gidNumber} = $gid; |
338 |
+ $ldif->{$dn}->{gecos} = $gecos || ''; |
339 |
+ $ldif->{$dn}->{cn} = $gecos || ''; |
340 |
+ $ldif->{$dn}->{homeDirectory} = $dir; |
341 |
+ $ldif->{$dn}->{loginShell} = $shell; |
342 |
+ |
343 |
+ if ($type eq 'user' or $key eq 'admin') |
344 |
+ { |
345 |
+ push @{$ldif->{$dn}->{objectClass}}, 'inetOrgPerson'; |
346 |
+ $ldif->{$dn}->{mail} = "$key\@$DomainName"; |
347 |
+ $ldif->{$dn}->{givenName} = $account->prop('FirstName') || ''; |
348 |
+ $ldif->{$dn}->{sn} = $account->prop('LastName') || ''; |
349 |
+ $ldif->{$dn}->{telephoneNumber} = $account->prop('Phone') || ''; |
350 |
+ $ldif->{$dn}->{o} = $account->prop('Company') || ''; |
351 |
+ $ldif->{$dn}->{ou} = $account->prop('Department') || ''; |
352 |
+ $ldif->{$dn}->{l} = $account->prop('City') || ''; |
353 |
+ $ldif->{$dn}->{street} = $account->prop('Street') || ''; |
354 |
+ } |
355 |
+ else |
356 |
+ { |
357 |
+ push @{$ldif->{$dn}->{objectClass}}, 'account'; |
358 |
} |
359 |
} |
360 |
endpwent(); |
361 |
|
362 |
+ # Read in group details |
363 |
+ while(my ($key,$pwd,$gid,$members) = getgrent()) |
364 |
+ { |
365 |
+ # skip non sme groups |
366 |
+ $account = $a->get($key) || next; |
367 |
+ $type = $account->prop('type') || 'unknown'; |
368 |
+ next unless ($type =~ m{^(?:user|group|ibay|machine)$} or $key eq 'admin'); |
369 |
+ |
370 |
+ $dn = "cn=$key,ou=Groups,$ldapBase"; |
371 |
+ utf8::upgrade($dn); |
372 |
+ |
373 |
+ $dnmap->{$key}->{group} = $dn; |
374 |
+ |
375 |
+ $ldif->{$dn}->{objectClass} = [ qw(posixGroup) ]; |
376 |
+ $ldif->{$dn}->{cn} = $key; |
377 |
+ $ldif->{$dn}->{userPassword} = ($pwd =~ m/^\{/) ? $pwd : "\{CRYPT\}$pwd"; |
378 |
+ $ldif->{$dn}->{gidNumber} = $gid; |
379 |
+ $ldif->{$dn}->{description} = $ldif->{$dnmap->{$key}->{user}}->{cn} if exists $ldif->{$dnmap->{$key}->{user}}->{cn}; |
380 |
+ $ldif->{$dn}->{memberUid} = [ split /\s+/, $members ]; |
381 |
+ |
382 |
+ if ($type eq 'group') |
383 |
+ { |
384 |
+ push @{$ldif->{$dn}->{objectClass}}, 'mailboxRelatedObject'; |
385 |
+ $ldif->{$dn}->{mail} = "$key\@$DomainName"; |
386 |
+ } |
387 |
+ } |
388 |
+ endgrent(); |
389 |
+ |
390 |
+ # Read in samba user details |
391 |
if ( -f "$schema" and -x '/usr/bin/pdbedit' ) |
392 |
{ |
393 |
foreach my $line (`/usr/bin/pdbedit -Lw 2> /dev/null`) |
394 |
{ |
395 |
my ($key,undef,$lmpass,$ntpass) = split(/:/,$line); |
396 |
- next unless exists $users->{$key}; |
397 |
- $users->{$key}->{sambaLMPassword} = $lmpass; |
398 |
- $users->{$key}->{sambaNTPassword} = $ntpass; |
399 |
+ next unless exists $dnmap->{$key}; |
400 |
+ |
401 |
+ push @{$ldif->{$dnmap->{$key}->{user}}->{objectClass}}, 'sambaSamAccount'; |
402 |
+ $ldif->{$dnmap->{$key}->{user}}->{sambaLMPassword} = $lmpass; |
403 |
+ $ldif->{$dnmap->{$key}->{user}}->{sambaNTPassword} = $ntpass; |
404 |
|
405 |
foreach my $info (`/usr/bin/pdbedit -v '$key' 2> /dev/null`){ |
406 |
- $users->{$key}->{sambaSID} = $1 if $info =~ m{User SID:\s+(S-.*)$}; |
407 |
- $users->{$key}->{displayName} = $1 if $info =~ m{Full Name:\s+(.*)$}; |
408 |
- $users->{$key}->{sambaPrimaryGroupSID} = $1 if $info =~ m{Primary Group SID:\s+(S-.*)$}; |
409 |
- $users->{$key}->{sambaAcctFlags} = $1 if $info =~ m{Account Flags:\s+(.*)$}; |
410 |
- $users->{$key}->{sambaPwdLastSet} = str2time($1) if $info =~ m{Password last set:\s+(.*)$}; |
411 |
+ $ldif->{$dnmap->{$key}->{user}}->{sambaSID} = $1 if $info =~ m{User SID:\s+(S-.*)$}; |
412 |
+ $ldif->{$dnmap->{$key}->{user}}->{displayName} = $1 if $info =~ m{Full Name:\s+(.*)$}; |
413 |
+ $ldif->{$dnmap->{$key}->{user}}->{sambaPrimaryGroupSID} = $1 if $info =~ m{Primary Group SID:\s+(S-.*)$}; |
414 |
+ $ldif->{$dnmap->{$key}->{user}}->{sambaAcctFlags} = $1 if $info =~ m{Account Flags:\s+(.*)$}; |
415 |
+ $ldif->{$dnmap->{$key}->{user}}->{sambaPwdLastSet} = str2time($1) if $info =~ m{Password last set:\s+(.*)$}; |
416 |
} |
417 |
} |
418 |
} |
419 |
|
420 |
- $groups = (); |
421 |
- while(my ($key,$pwd,$gid,$members) = getgrent()) |
422 |
+ # Read in samba group mappings |
423 |
+ if ( -f "$schema" and -x '/usr/bin/net' ) |
424 |
{ |
425 |
- # skip non sme groups |
426 |
- $a->get($key) || next; |
427 |
- |
428 |
- $groups->{$key}->{cn} = $key; |
429 |
- $groups->{$key}->{userPassword} = ($pwd =~ m/^\{/) ? $pwd : "\{CRYPT\}$pwd"; |
430 |
- $groups->{$key}->{gidNumber} = $gid; |
431 |
- $groups->{$key}->{description} = $users->{$key}->{cn} if exists $users->{$key}->{cn}; |
432 |
- $groups->{$key}->{memberUid} = [ split /\s+/, $members ]; |
433 |
+ foreach (`/usr/bin/net groupmap list 2> /dev/null`){ |
434 |
+ chomp; |
435 |
+ next if m{\(S-1-5-32-\d+\)}; |
436 |
+ if (/^(.*) \((S-.*-\d+)\) -> (.*)$/) |
437 |
+ { |
438 |
+ next unless exists $dnmap->{$3}; |
439 |
+ |
440 |
+ push @{$ldif->{$dnmap->{$3}->{group}}->{objectClass}}, 'sambaGroupMapping'; |
441 |
+ $ldif->{$dnmap->{$3}->{group}}->{displayName} = $1; |
442 |
+ $ldif->{$dnmap->{$3}->{group}}->{sambaSID} = $2; |
443 |
+ $ldif->{$dnmap->{$3}->{group}}->{sambaGroupType} = '2'; |
444 |
+ } |
445 |
+ } |
446 |
} |
447 |
- endgrent(); |
448 |
|
449 |
- foreach (`/usr/bin/net groupmap list 2> /dev/null`){ |
450 |
- chomp; |
451 |
- next if m{\(S-1-5-32-\d+\)}; |
452 |
- if (/^(.*) \((S-.*-\d+)\) -> (.*)$/) |
453 |
- { |
454 |
- next unless exists $groups->{$3}; |
455 |
- $groups->{$3}->{displayName} = $1; |
456 |
- $groups->{$3}->{sambaSID} = $2; |
457 |
- $groups->{$3}->{sambaGroupType} = '2'; |
458 |
+ # Ensure that attributes are utf8 |
459 |
+ foreach $dn (keys %$ldif) |
460 |
+ { |
461 |
+ foreach $attr ( keys %{$ldif->{$dn}} ) |
462 |
+ { |
463 |
+ if ( ref($ldif->{$dn}->{$attr}) eq 'ARRAY' ) |
464 |
+ { |
465 |
+ for (my $c = 0; $c < scalar(@{$ldif->{$dn}->{$attr}}); $c++) |
466 |
+ { |
467 |
+ utf8::upgrade($ldif->{$dn}->{$attr}[$c]); |
468 |
+ } |
469 |
+ } |
470 |
+ else |
471 |
+ { |
472 |
+ utf8::upgrade($ldif->{$dn}->{$attr}); |
473 |
+ } |
474 |
} |
475 |
} |
476 |
|