View | Details | Raw Unified | Return to bug 41659 | Differences between
and this patch

Collapse All | Expand All

(-)a/management/univention-directory-manager-modules/debian/python-univention-directory-manager.preinst (+4 lines)
 Lines 32-37    Link Here 
32
32
33
#DEBHELPER#
33
#DEBHELPER#
34
34
35
if [ "$1" = "upgrade" ] && dpkg --compare-versions "$2" lt 11.0.3-26; then
36
	ln -s /usr/share/pyshared/univention/admin/handlers/computers/base.py /usr/lib/pymodules/python2.7/univention/admin/handlers/computers/base.py
37
fi
38
35
if [ "$1" = "upgrade" ] && dpkg --compare-versions "$2" lt 10.0.29-53; then
39
if [ "$1" = "upgrade" ] && dpkg --compare-versions "$2" lt 10.0.29-53; then
36
	ln -s /usr/share/pyshared/univention/admin/policy.py /usr/lib/pymodules/python2.7/univention/admin/policy.py
40
	ln -s /usr/share/pyshared/univention/admin/policy.py /usr/lib/pymodules/python2.7/univention/admin/policy.py
37
fi
41
fi
38
   Bug #41659: unify computers/* code
42
   Bug #41659: unify computers/* code
(-)a/management/univention-directory-manager-modules/modules/univention/admin/handlers/computers/base.py (+358 lines)
Line 0    Link Here 
1
# -*- coding: utf-8 -*-
2
#
3
# Univention Admin Modules
4
#  admin module for generic computer objects
5
#
6
# Copyright 2016 Univention GmbH
7
#
8
# http://www.univention.de/
9
#
10
# All rights reserved.
11
#
12
# The source code of this program is made available
13
# under the terms of the GNU Affero General Public License version 3
14
# (GNU AGPL V3) as published by the Free Software Foundation.
15
#
16
# Binary versions of this program provided by Univention to you as
17
# well as other copyrighted, protected or trademarked materials like
18
# Logos, graphics, fonts, specific documentations and configurations,
19
# cryptographic keys etc. are subject to a license agreement between
20
# you and Univention and not subject to the GNU AGPL V3.
21
#
22
# In the case you use this program under the terms of the GNU AGPL V3,
23
# the program is provided in the hope that it will be useful,
24
# but WITHOUT ANY WARRANTY; without even the implied warranty of
25
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
26
# GNU Affero General Public License for more details.
27
#
28
# You should have received a copy of the GNU Affero General Public
29
# License with the Debian GNU/Linux or Univention distribution in file
30
# /usr/share/common-licenses/AGPL-3; if not, see
31
# <http://www.gnu.org/licenses/>.
32
33
import time
34
from ldap.filter import filter_format
35
36
import univention.admin.filter
37
import univention.admin.handlers
38
import univention.admin.password
39
import univention.admin.allocators
40
import univention.admin.localization
41
import univention.admin.uldap
42
import univention.admin.nagios as nagios
43
import univention.admin.handlers.groups.group
44
45
translation=univention.admin.localization.translation('univention.admin.handlers.computers')
46
_=translation.translate
47
48
49
class computerBase(univention.admin.handlers.simpleComputer, nagios.Support):
50
	CONFIG_NAME = None
51
	SERVER_ROLE = None
52
	SERVER_TYPE = None
53
	SAMBA_ACCOUNT_FLAG = None
54
	DEFAULT_OCS = []
55
	def __init__(self, co, lo, position, dn='', superordinate=None, attributes = [] ):
56
		univention.admin.handlers.simpleComputer.__init__(self, co, lo, position, dn, superordinate, attributes)
57
		nagios.Support.__init__(self)
58
59
	def open(self):
60
		univention.admin.handlers.simpleComputer.open( self )
61
		self.nagios_open()
62
63
		if self.exists():
64
			if 'posix' in self.options and not self.info.get( 'primaryGroup' ):
65
				primaryGroupNumber=self.oldattr.get('gidNumber',[''])[0]
66
				univention.debug.debug(univention.debug.ADMIN, univention.debug.INFO, 'primary group number = %s' % (primaryGroupNumber))
67
				if primaryGroupNumber:
68
					primaryGroupResult=self.lo.searchDn(filter_format('(&(objectClass=posixGroup)(gidNumber=%s))', [primaryGroupNumber]))
69
					if primaryGroupResult:
70
						self['primaryGroup']=primaryGroupResult[0]
71
						univention.debug.debug(univention.debug.ADMIN, univention.debug.INFO, 'Set primary group = %s' % (self['primaryGroup']))
72
					else:
73
						self['primaryGroup']=None
74
						self.save()
75
						raise univention.admin.uexceptions.primaryGroup
76
				else:
77
					self['primaryGroup']=None
78
					self.save()
79
					raise univention.admin.uexceptions.primaryGroup
80
			if 'samba' in self.options:
81
				sid = self.oldattr.get('sambaSID', [''])[0]
82
				pos = sid.rfind('-')
83
				self.info['sambaRID'] = sid[pos+1:]
84
85
		self.modifypassword=0
86
		if self.exists():
87
			userPassword=self.oldattr.get('userPassword',[''])[0]
88
			if userPassword:
89
				self.info['password']=userPassword
90
				self.modifypassword=0
91
			self.save()
92
		else:
93
			self.modifypassword=0
94
			if 'posix' in self.options:
95
				res=univention.admin.config.getDefaultValue(self.lo, self.CONFIG_NAME, position=self.position)
96
				if res:
97
					self['primaryGroup']=res
98
99
	def _ldap_pre_create(self):
100
		super(object, self)._ldap_pre_create()
101
		if not self['password']:
102
			self['password']=self.oldattr.get('password',[''])[0]
103
			self.modifypassword=0
104
105
	def _ldap_addlist(self):
106
		self.check_required_options()
107
		ocs=list(self.DEFAULT_OCS)
108
		al=[]
109
		if 'kerberos' in self.options:
110
			domain=univention.admin.uldap.domain(self.lo, self.position)
111
			realm=domain.getKerberosRealm()
112
113
			if realm:
114
				al.append(('krb5MaxLife', '86400'))
115
				al.append(('krb5MaxRenew', '604800'))
116
				al.append(('krb5KDCFlags', '126'))
117
				krb_key_version=str(int(self.oldattr.get('krb5KeyVersionNumber', ['0'])[0])+1)
118
				al.append(('krb5KeyVersionNumber', self.oldattr.get('krb5KeyVersionNumber', []), krb_key_version))
119
			else:
120
				# can't do kerberos
121
				self._remove_option( 'kerberos' )
122
		if 'posix' in self.options:
123
			self.uidNum=univention.admin.allocators.request(self.lo, self.position, 'uidNumber')
124
			self.alloc.append(('uidNumber',self.uidNum))
125
			gidNum = self.get_gid_for_primary_group()
126
			al.append(('uidNumber', [self.uidNum]))
127
			al.append(('gidNumber', [gidNum]))
128
129
		if self.modifypassword or self['password']:
130
			if 'kerberos' in self.options:
131
				krb_keys=univention.admin.password.krb5_asn1(self.krb5_principal(), self['password'])
132
				al.append(('krb5Key', self.oldattr.get('password', ['1']), krb_keys))
133
			if 'posix' in self.options:
134
				password_crypt = "{crypt}%s" % (univention.admin.password.crypt(self['password']))
135
				al.append(('userPassword', self.oldattr.get('userPassword', [''])[0], password_crypt))
136
			if 'samba' in self.options:
137
				password_nt, password_lm = univention.admin.password.ntlm(self['password'])
138
				al.append(('sambaNTPassword', self.oldattr.get('sambaNTPassword', [''])[0], password_nt))
139
				al.append(('sambaLMPassword', self.oldattr.get('sambaLMPassword', [''])[0], password_lm))
140
				sambaPwdLastSetValue = str(long(time.time()))
141
				al.append(('sambaPwdLastSet', self.oldattr.get('sambaPwdLastSet', [''])[0], sambaPwdLastSetValue))
142
			self.modifypassword=0
143
		if 'samba' in self.options:
144
			acctFlags=univention.admin.samba.acctFlags(flags={self.SAMBA_ACCOUNT_FLAG:1})
145
			if self.s4connector_present:
146
				# In this case Samba 4 must create the SID, the s4 connector will sync the
147
				# new sambaSID back from Samba 4.
148
				self.machineSid='S-1-4-%s' % self.uidNum
149
			else:
150
				self.machineSid = self.getMachineSid(self.lo, self.position, self.uidNum, self.get('sambaRID'))
151
				self.alloc.append(('sid',self.machineSid))
152
			al.append(('sambaSID', [self.machineSid]))
153
			al.append(('sambaAcctFlags', [acctFlags.decode()]))
154
			al.append(('displayName', self.info['name']))
155
156
		al.insert(0, ('objectClass', ocs))
157
		if self.SERVER_ROLE:
158
			al.append(('univentionServerRole', '', self.SERVER_ROLE))
159
		return al
160
161
	def check_required_options(self):
162
		pass
163
164
	def _ldap_post_create(self):
165
		if 'posix' in self.options:
166
			if hasattr(self, 'uid') and self.uid:
167
				univention.admin.allocators.confirm(self.lo, self.position, 'uid', self.uid)
168
			univention.admin.handlers.simpleComputer.primary_group( self )
169
			univention.admin.handlers.simpleComputer.update_groups( self )
170
		univention.admin.handlers.simpleComputer._ldap_post_create( self )
171
		self.nagios_ldap_post_create()
172
173
	def _ldap_pre_remove(self):
174
		self.open()
175
		if 'posix' in self.options and self.oldattr.get( 'uidNumber' ):
176
			self.uidNum=self.oldattr['uidNumber'][0]
177
178
	def _ldap_post_remove(self):
179
		if 'posix' in self.options:
180
			univention.admin.allocators.release(self.lo, self.position, 'uidNumber', self.uidNum)
181
		groupObjects=univention.admin.handlers.groups.group.lookup(self.co, self.lo, filter_s=filter_format('uniqueMember', [self.dn]))
182
		if groupObjects:
183
			for i in range(0, len(groupObjects)):
184
				groupObjects[i].open()
185
				if self.dn in groupObjects[i]['users']:
186
					groupObjects[i]['users'].remove(self.dn)
187
					groupObjects[i].modify(ignore_license=1)
188
189
		self.nagios_ldap_post_remove()
190
		univention.admin.handlers.simpleComputer._ldap_post_remove( self )
191
		# Need to clean up oldinfo. If remove was invoked, because the
192
		# creation of the object has failed, the next try will result in
193
		# a 'object class violation' (Bug #19343)
194
		self.oldinfo = {}
195
196
	def krb5_principal(self):
197
		domain=univention.admin.uldap.domain(self.lo, self.position)
198
		realm=domain.getKerberosRealm()
199
		if self.info.has_key('domain') and self.info['domain']:
200
			kerberos_domain=self.info['domain']
201
		else:
202
			kerberos_domain=domain.getKerberosRealm()
203
		return 'host/' + self['name']+'.'+kerberos_domain.lower()+'@'+realm
204
205
	def _ldap_post_modify(self):
206
		univention.admin.handlers.simpleComputer.primary_group( self )
207
		univention.admin.handlers.simpleComputer.update_groups( self )
208
		univention.admin.handlers.simpleComputer._ldap_post_modify( self )
209
		self.nagios_ldap_post_modify()
210
211
	def _ldap_pre_modify(self):
212
		if self.hasChanged('password'):
213
			if not self['password']:
214
				self['password']=self.oldattr.get('password',[''])[0]
215
				self.modifypassword=0
216
			elif not self.info['password']:
217
				self['password']=self.oldattr.get('password',[''])[0]
218
				self.modifypassword=0
219
			else:
220
				self.modifypassword=1
221
		self.nagios_ldap_pre_modify()
222
		univention.admin.handlers.simpleComputer._ldap_pre_modify( self )
223
224
225
	def _ldap_modlist(self):
226
		ml=univention.admin.handlers.simpleComputer._ldap_modlist( self )
227
228
		self.nagios_ldap_modlist(ml)
229
230
		if self.hasChanged('name'):
231
			if 'posix' in self.options:
232
				if hasattr(self, 'uidNum'):
233
					univention.admin.allocators.confirm(self.lo, self.position, 'uidNumber', self.uidNum)
234
				requested_uid="%s$" % self['name']
235
				try:
236
					self.uid=univention.admin.allocators.request(self.lo, self.position, 'uid', value=requested_uid)
237
				except Exception:
238
					self.cancel()
239
					raise univention.admin.uexceptions.uidAlreadyUsed, ': %s' % requested_uid
240
241
				self.alloc.append(('uid',self.uid))
242
243
				ml.append(('uid', self.oldattr.get('uid', [None])[0], self.uid))
244
245
			if 'samba' in self.options:
246
				ml.append(('displayName', self.oldattr.get('displayName', [None])[0], self['name']))
247
248
			if 'kerberos' in self.options:
249
				ml.append(('krb5PrincipalName', self.oldattr.get('krb5PrincipalName', []), [self.krb5_principal()]))
250
251
		if self.modifypassword and self['password']:
252
			if 'kerberos' in self.options:
253
				krb_keys=univention.admin.password.krb5_asn1(self.krb5_principal(), self['password'])
254
				krb_key_version=str(int(self.oldattr.get('krb5KeyVersionNumber', ['0'])[0])+1)
255
				ml.append(('krb5Key', self.oldattr.get('password', ['1']), krb_keys))
256
				ml.append(('krb5KeyVersionNumber', self.oldattr.get('krb5KeyVersionNumber', []), krb_key_version))
257
			if 'posix' in self.options:
258
				password_crypt = "{crypt}%s" % (univention.admin.password.crypt(self['password']))
259
				ml.append(('userPassword', self.oldattr.get('userPassword', [''])[0], password_crypt))
260
			if 'samba' in self.options:
261
				password_nt, password_lm = univention.admin.password.ntlm(self['password'])
262
				ml.append(('sambaNTPassword', self.oldattr.get('sambaNTPassword', [''])[0], password_nt))
263
				ml.append(('sambaLMPassword', self.oldattr.get('sambaLMPassword', [''])[0], password_lm))
264
				sambaPwdLastSetValue = str(long(time.time()))
265
				ml.append(('sambaPwdLastSet', self.oldattr.get('sambaPwdLastSet', [''])[0], sambaPwdLastSetValue))
266
267
		# add samba option
268
		if self.exists() and self.option_toggled('samba') and 'samba' in self.options:
269
			acctFlags=univention.admin.samba.acctFlags(flags={self.SAMBA_ACCOUNT_FLAG:1})
270
			if self.s4connector_present:
271
				# In this case Samba 4 must create the SID, the s4 connector will sync the
272
				# new sambaSID back from Samba 4.
273
				self.machineSid='S-1-4-%s' % self.oldattr['uidNumber'][0]
274
			else:
275
				self.machineSid = self.getMachineSid(self.lo, self.position, self.oldattr['uidNumber'][0], self.get('sambaRID'))
276
				self.alloc.append(('sid',self.machineSid))
277
			ml.append(('sambaSID', '', [self.machineSid]))
278
			ml.append(('sambaAcctFlags', '', [acctFlags.decode()]))
279
			ml.append(('displayName', '', self.info['name']))
280
			sambaPwdLastSetValue = str(long(time.time()))
281
			ml.append(('sambaPwdLastSet', self.oldattr.get('sambaPwdLastSet', [''])[0], sambaPwdLastSetValue))
282
		if self.exists() and self.option_toggled('samba') and 'samba' not in self.options:
283
			for key in [ 'sambaSID', 'sambaAcctFlags', 'sambaNTPassword', 'sambaLMPassword', 'sambaPwdLastSet', 'displayName' ]:
284
				if self.oldattr.get(key, []):
285
					ml.insert(0, (key, self.oldattr.get(key, []), ''))
286
287
		if self.hasChanged('sambaRID') and not hasattr(self, 'machineSid'):
288
			self.machineSid = self.getMachineSid(self.lo, self.position, self.oldattr['uidNumber'][0], self.get('sambaRID'))
289
			ml.append(('sambaSID', self.oldattr.get('sambaSID', ['']), [self.machineSid]))
290
291
		return ml
292
293
	def cleanup(self):
294
		self.open()
295
		self.nagios_cleanup()
296
		univention.admin.handlers.simpleComputer.cleanup( self )
297
298
	def cancel(self):
299
		for i,j in self.alloc:
300
			univention.debug.debug(univention.debug.ADMIN, univention.debug.WARN, 'cancel: release (%s): %s' % (i,j) )
301
			univention.admin.allocators.release(self.lo, self.position, i, j)
302
303
	def link(self):
304
		result = []
305
		if self['ip'] and len( self[ 'ip' ] ) > 0 and self['ip'][ 0 ]:
306
			result = [{ 'url': 'https://%s/univention-management-console/' % self['ip'][ 0 ],
307
						'ipaddr': self['ip'][ 0 ],
308
						}]
309
		if self.has_key('dnsEntryZoneForward') and self['dnsEntryZoneForward'] and len( self['dnsEntryZoneForward' ] ) > 0:
310
			zone = univention.admin.uldap.explodeDn( self['dnsEntryZoneForward'][0], 1)[0]
311
			if not result:
312
				result = [ { 'url': 'https://%s.%s/univention-management-console/' % (self['name'], zone) }]
313
			result[0]['fqdn'] = '%s.%s' % (self['name'], zone)
314
		if result:
315
			result[0]['name'] = _('Open Univention Management Console on this computer')
316
			return result
317
		return None
318
319
	@classmethod
320
	def rewrite(cls, filter, mapping):
321
		if filter.variable == 'ip':
322
			filter.variable='aRecord'
323
		else:
324
			univention.admin.mapping.mapRewrite(filter, cls.mapping)
325
326
	@classmethod
327
	def lookup_filter(cls, filter_s=None, lo=None):
328
		filter_s = univention.admin.filter.replace_fqdn_filter( filter_s )
329
		if str(filter_s).find('(dnsAlias=') != -1:
330
			filter_s = univention.admin.handlers.dns.alias.lookup_alias_filter(lo, filter_s)
331
			if filter_s:
332
				return cls.lookup_filter(filter_s, lo)
333
			else:
334
				return None
335
		lookup_filter_obj = univention.admin.filter.conjunction('&', [x for x in [
336
				univention.admin.filter.expression('objectClass', 'univentionHost'),
337
				univention.admin.filter.expression('objectClass', cls.SERVER_TYPE),
338
				None if not cls.SERVER_ROLE else univention.admin.filter.expression('univentionServerRole', cls.SERVER_ROLE),
339
			] if x is not None])
340
341
		# ATTENTION: has its own rewrite function.
342
		lookup_filter_obj.append_unmapped_filter_string(filter_s, cls.rewrite, cls.mapping)
343
		return lookup_filter_obj
344
345
	@classmethod
346
	def lookup(cls, co, lo, filter_s, base='', superordinate=None, scope='sub', unique=0, required=0, timeout=-1, sizelimit=0):
347
348
		filter=cls.lookup_filter(filter_s, lo)
349
		if filter is None:
350
			return []
351
		res=[]
352
		for dn, attrs in lo.search(unicode(filter), base, scope, [], unique, required, timeout, sizelimit):
353
			res.append( cls( co, lo, None, dn, attributes = attrs ) )
354
		return res
355
356
	@classmethod
357
	def identify(cls, dn, attr, canonical=0):
358
		return 'univentionHost' in attr.get('objectClass', []) and cls.SERVER_TYPE in attr.get('objectClass', []) and (True if not cls.SERVER_ROLE else cls.SERVER_ROLE in attr.get('univentionServerRole', []))
(-)a/management/univention-directory-manager-modules/modules/univention/admin/handlers/computers/domaincontroller_backup.py (-311 / +14 lines)
 Lines 1-7    Link Here 
1
# -*- coding: utf-8 -*-
1
# -*- coding: utf-8 -*-
2
#
2
#
3
# Univention Admin Modules
3
# Univention Admin Modules
4
#  admin module for the DC Backup hosts 
4
#  admin module for the DC Backup hosts
5
#
5
#
6
# Copyright 2004-2016 Univention GmbH
6
# Copyright 2004-2016 Univention GmbH
7
#
7
#
 Lines 30-50    Link Here 
30
# /usr/share/common-licenses/AGPL-3; if not, see
30
# /usr/share/common-licenses/AGPL-3; if not, see
31
# <http://www.gnu.org/licenses/>.
31
# <http://www.gnu.org/licenses/>.
32
32
33
from ldap.filter import filter_format
34
35
from univention.admin.layout import Tab, Group
33
from univention.admin.layout import Tab, Group
36
import univention.admin.filter
34
import univention.admin.filter
37
import univention.admin.handlers
35
import univention.admin.handlers
38
import univention.admin.password
39
import univention.admin.allocators
40
import univention.admin.localization
36
import univention.admin.localization
41
import univention.admin.uldap
42
import univention.admin.nagios as nagios
37
import univention.admin.nagios as nagios
43
import univention.admin.handlers.dns.forward_zone
38
from univention.admin.handlers.computers.base import computerBase
44
import univention.admin.handlers.dns.reverse_zone
45
import univention.admin.handlers.groups.group
46
import univention.admin.handlers.networks.network
47
import time
48
39
49
translation=univention.admin.localization.translation('univention.admin.handlers.computers')
40
translation=univention.admin.localization.translation('univention.admin.handlers.computers')
50
_=translation.translate
41
_=translation.translate
 Lines 402-705    Link Here 
402
nagios.addPropertiesMappingOptionsAndLayout(property_descriptions, mapping, options, layout)
393
nagios.addPropertiesMappingOptionsAndLayout(property_descriptions, mapping, options, layout)
403
394
404
395
405
class object(univention.admin.handlers.simpleComputer, nagios.Support):
396
class object(computerBase):
406
	module=module
397
	module=module
407
398
	mapping = mapping
408
	def __init__(self, co, lo, position, dn='', superordinate=None, attributes = [] ):
399
	CONFIG_NAME = 'univentionDefaultDomainControllerMasterGroup'
409
		univention.admin.handlers.simpleComputer.__init__(self, co, lo, position, dn, superordinate, attributes)
400
	DEFAULT_OCS = ['top', 'person', 'univentionHost', 'univentionDomainController']
410
		nagios.Support.__init__(self)
401
	SAMBA_ACCOUNT_FLAG = 'S'
411
402
	SERVER_TYPE = 'univentionDomainController'
412
	def open(self):
403
	SERVER_ROLE = 'backup'
413
		univention.admin.handlers.simpleComputer.open( self )
404
414
		self.nagios_open()
405
rewrite = object.rewrite
415
406
lookup_filter = object.lookup_filter
416
		self.modifypassword=0
407
lookup = object.lookup
417
		if self.exists():
408
identify = object.identify
418
			userPassword=self.oldattr.get('userPassword',[''])[0]
419
			if userPassword:
420
				self.info['password']=userPassword
421
				self.modifypassword=0
422
		if self.exists():
423
424
			if 'posix' in self.options and not self.info.get( 'primaryGroup' ):
425
				primaryGroupNumber=self.oldattr.get('gidNumber',[''])[0]
426
				univention.debug.debug(univention.debug.ADMIN, univention.debug.INFO, 'primary group number = %s' % (primaryGroupNumber))
427
				if primaryGroupNumber:
428
					primaryGroupResult=self.lo.searchDn(filter_format('(&(objectClass=posixGroup)(gidNumber=%s))', [primaryGroupNumber]))
429
					if primaryGroupResult:
430
						self['primaryGroup']=primaryGroupResult[0]
431
						univention.debug.debug(univention.debug.ADMIN, univention.debug.INFO, 'Set primary group = %s' % (self['primaryGroup']))
432
					else:
433
						self['primaryGroup']=None
434
						self.save()
435
						raise univention.admin.uexceptions.primaryGroup
436
				else:
437
					self['primaryGroup']=None
438
					self.save()
439
					raise univention.admin.uexceptions.primaryGroup
440
			if 'samba' in self.options:
441
				sid = self.oldattr.get('sambaSID', [''])[0]
442
				pos = sid.rfind('-')
443
				self.info['sambaRID'] = sid[pos+1:]
444
445
			self.save()
446
		else:
447
			self.modifypassword=0
448
			if 'posix' in self.options:
449
				res=univention.admin.config.getDefaultValue(self.lo, 'univentionDefaultDomainControllerMasterGroup', position=self.position)
450
				if res:
451
					self['primaryGroup']=res
452
453
	def _ldap_pre_create(self):
454
		super(object, self)._ldap_pre_create()
455
		if not self['password']:
456
			self['password']=self.oldattr.get('password',[''])[0]
457
			self.modifypassword=0
458
459
	def _ldap_addlist(self):
460
		ocs=['top', 'person', 'univentionHost', 'univentionDomainController']
461
		al=[]
462
		if 'kerberos' in self.options:
463
			domain=univention.admin.uldap.domain(self.lo, self.position)
464
			realm=domain.getKerberosRealm()
465
466
			if realm:
467
				al.append(('krb5MaxLife', '86400'))
468
				al.append(('krb5MaxRenew', '604800'))
469
				al.append(('krb5KDCFlags', '126'))
470
				krb_key_version=str(int(self.oldattr.get('krb5KeyVersionNumber', ['0'])[0])+1)
471
				al.append(('krb5KeyVersionNumber', self.oldattr.get('krb5KeyVersionNumber', []), krb_key_version))
472
			else:
473
				# can't do kerberos
474
				self._remove_option( 'kerberos' )
475
		if 'posix' in self.options:
476
			self.uidNum=univention.admin.allocators.request(self.lo, self.position, 'uidNumber')
477
			self.alloc.append(('uidNumber',self.uidNum))
478
			gidNum = self.get_gid_for_primary_group()
479
			al.append(('uidNumber', [self.uidNum]))
480
			al.append(('gidNumber', [gidNum]))
481
482
		if self.modifypassword or self['password']:
483
			if 'kerberos' in self.options:
484
				krb_keys=univention.admin.password.krb5_asn1(self.krb5_principal(), self['password'])
485
				al.append(('krb5Key', self.oldattr.get('password', ['1']), krb_keys))
486
			if 'posix' in self.options:
487
				password_crypt = "{crypt}%s" % (univention.admin.password.crypt(self['password']))
488
				al.append(('userPassword', self.oldattr.get('userPassword', [''])[0], password_crypt))
489
			if 'samba' in self.options:
490
				password_nt, password_lm = univention.admin.password.ntlm(self['password'])
491
				al.append(('sambaNTPassword', self.oldattr.get('sambaNTPassword', [''])[0], password_nt))
492
				al.append(('sambaLMPassword', self.oldattr.get('sambaLMPassword', [''])[0], password_lm))
493
				sambaPwdLastSetValue = str(long(time.time()))
494
				al.append(('sambaPwdLastSet', self.oldattr.get('sambaPwdLastSet', [''])[0], sambaPwdLastSetValue))
495
			self.modifypassword=0
496
		if 'samba' in self.options:
497
			acctFlags=univention.admin.samba.acctFlags(flags={'S':1})
498
			if self.s4connector_present:
499
				# In this case Samba 4 must create the SID, the s4 connector will sync the
500
				# new sambaSID back from Samba 4.
501
				self.machineSid='S-1-4-%s' % self.uidNum
502
			else:
503
				self.machineSid = self.getMachineSid(self.lo, self.position, self.uidNum, self.get('sambaRID'))
504
				self.alloc.append(('sid',self.machineSid))
505
			al.append(('sambaSID', [self.machineSid]))
506
			al.append(('sambaAcctFlags', [acctFlags.decode()]))
507
			al.append(('displayName', self.info['name']))
508
509
		al.insert(0, ('objectClass', ocs))
510
		al.append(('univentionServerRole', '', 'backup'))
511
		return al
512
513
	def _ldap_post_create(self):
514
		if 'posix' in self.options:
515
			if hasattr(self, 'uid') and self.uid:
516
				univention.admin.allocators.confirm(self.lo, self.position, 'uid', self.uid)
517
			univention.admin.handlers.simpleComputer.primary_group( self )
518
			univention.admin.handlers.simpleComputer.update_groups( self )
519
		univention.admin.handlers.simpleComputer._ldap_post_create( self )
520
		self.nagios_ldap_post_create()
521
522
	def _ldap_pre_remove(self):
523
		self.open()
524
		if 'posix' in self.options and self.oldattr.get( 'uidNumber' ):
525
			self.uidNum=self.oldattr['uidNumber'][0]
526
527
	def _ldap_post_remove(self):
528
		if 'posix' in self.options:
529
			univention.admin.allocators.release(self.lo, self.position, 'uidNumber', self.uidNum)
530
		groupObjects=univention.admin.handlers.groups.group.lookup(self.co, self.lo, filter_s=filter_format('uniqueMember', [self.dn]))
531
		if groupObjects:
532
			for i in range(0, len(groupObjects)):
533
				groupObjects[i].open()
534
				if self.dn in groupObjects[i]['users']:
535
					groupObjects[i]['users'].remove(self.dn)
536
					groupObjects[i].modify(ignore_license=1)
537
538
		self.nagios_ldap_post_remove()
539
		univention.admin.handlers.simpleComputer._ldap_post_remove( self )
540
		# Need to clean up oldinfo. If remove was invoked, because the
541
		# creation of the object has failed, the next try will result in
542
		# a 'object class violation' (Bug #19343)
543
		self.oldinfo = {}
544
545
	def krb5_principal(self):
546
		domain=univention.admin.uldap.domain(self.lo, self.position)
547
		realm=domain.getKerberosRealm()
548
		if self.info.has_key('domain') and self.info['domain']:
549
			kerberos_domain=self.info['domain']
550
		else:
551
			kerberos_domain=domain.getKerberosRealm()
552
		return 'host/' + self['name']+'.'+kerberos_domain.lower()+'@'+realm
553
554
	def _ldap_post_modify(self):
555
		univention.admin.handlers.simpleComputer.primary_group( self )
556
		univention.admin.handlers.simpleComputer.update_groups( self )
557
		univention.admin.handlers.simpleComputer._ldap_post_modify( self )
558
		self.nagios_ldap_post_modify()
559
560
	def _ldap_pre_modify(self):
561
		if self.hasChanged('password'):
562
			if not self['password']:
563
				self['password']=self.oldattr.get('password',[''])[0]
564
				self.modifypassword=0
565
			elif not self.info['password']:
566
				self['password']=self.oldattr.get('password',[''])[0]
567
				self.modifypassword=0
568
			else:
569
				self.modifypassword=1
570
		self.nagios_ldap_pre_modify()
571
		univention.admin.handlers.simpleComputer._ldap_pre_modify( self )
572
573
574
	def _ldap_modlist(self):
575
		ml=univention.admin.handlers.simpleComputer._ldap_modlist( self )
576
577
		self.nagios_ldap_modlist(ml)
578
579
		if self.hasChanged('name'):
580
			if 'posix' in self.options:
581
				if hasattr(self, 'uidNum'):
582
					univention.admin.allocators.confirm(self.lo, self.position, 'uidNumber', self.uidNum)
583
				requested_uid="%s$" % self['name']
584
				try:
585
					self.uid=univention.admin.allocators.request(self.lo, self.position, 'uid', value=requested_uid)
586
				except Exception:
587
					self.cancel()
588
					raise univention.admin.uexceptions.uidAlreadyUsed, ': %s' % requested_uid
589
					return []
590
591
				self.alloc.append(('uid',self.uid))
592
593
				ml.append(('uid', self.oldattr.get('uid', [None])[0], self.uid))
594
595
			if 'samba' in self.options:
596
				ml.append(('displayName', self.oldattr.get('displayName', [None])[0], self['name']))
597
598
			if 'kerberos' in self.options:
599
				ml.append(('krb5PrincipalName', self.oldattr.get('krb5PrincipalName', []), [self.krb5_principal()]))
600
601
		if self.modifypassword and self['password']:
602
			if 'kerberos' in self.options:
603
				krb_keys=univention.admin.password.krb5_asn1(self.krb5_principal(), self['password'])
604
				krb_key_version=str(int(self.oldattr.get('krb5KeyVersionNumber', ['0'])[0])+1)
605
				ml.append(('krb5Key', self.oldattr.get('password', ['1']), krb_keys))
606
				ml.append(('krb5KeyVersionNumber', self.oldattr.get('krb5KeyVersionNumber', []), krb_key_version))
607
			if 'posix' in self.options:
608
				password_crypt = "{crypt}%s" % (univention.admin.password.crypt(self['password']))
609
				ml.append(('userPassword', self.oldattr.get('userPassword', [''])[0], password_crypt))
610
			if 'samba' in self.options:
611
				password_nt, password_lm = univention.admin.password.ntlm(self['password'])
612
				ml.append(('sambaNTPassword', self.oldattr.get('sambaNTPassword', [''])[0], password_nt))
613
				ml.append(('sambaLMPassword', self.oldattr.get('sambaLMPassword', [''])[0], password_lm))
614
				sambaPwdLastSetValue = str(long(time.time()))
615
				ml.append(('sambaPwdLastSet', self.oldattr.get('sambaPwdLastSet', [''])[0], sambaPwdLastSetValue))
616
617
		# add samba option
618
		if self.exists() and self.option_toggled('samba') and 'samba' in self.options:
619
			acctFlags=univention.admin.samba.acctFlags(flags={'S':1})
620
			if self.s4connector_present:
621
				# In this case Samba 4 must create the SID, the s4 connector will sync the
622
				# new sambaSID back from Samba 4.
623
				self.machineSid='S-1-4-%s' % self.oldattr['uidNumber'][0]
624
			else:
625
				self.machineSid = self.getMachineSid(self.lo, self.position, self.oldattr['uidNumber'][0], self.get('sambaRID'))
626
				self.alloc.append(('sid',self.machineSid))
627
			ml.append(('sambaSID', '', [self.machineSid]))
628
			ml.append(('sambaAcctFlags', '', [acctFlags.decode()]))
629
			ml.append(('displayName', '', self.info['name']))
630
			sambaPwdLastSetValue = str(long(time.time()))
631
			ml.append(('sambaPwdLastSet', self.oldattr.get('sambaPwdLastSet', [''])[0], sambaPwdLastSetValue))
632
		if self.exists() and self.option_toggled('samba') and 'samba' not in self.options:
633
			for key in [ 'sambaSID', 'sambaAcctFlags', 'sambaNTPassword', 'sambaLMPassword', 'sambaPwdLastSet', 'displayName' ]:
634
				if self.oldattr.get(key, []):
635
					ml.insert(0, (key, self.oldattr.get(key, []), ''))
636
637
		if self.hasChanged('sambaRID') and not hasattr(self, 'machineSid'):
638
			self.machineSid = self.getMachineSid(self.lo, self.position, self.oldattr['uidNumber'][0], self.get('sambaRID'))
639
			ml.append(('sambaSID', self.oldattr.get('sambaSID', ['']), [self.machineSid]))
640
641
		return ml
642
643
	def cleanup(self):
644
		self.open()
645
		self.nagios_cleanup()
646
		univention.admin.handlers.simpleComputer.cleanup( self )
647
648
	def cancel(self):
649
		for i,j in self.alloc:
650
			univention.debug.debug(univention.debug.ADMIN, univention.debug.WARN, 'cancel: release (%s): %s' % (i,j) )
651
			univention.admin.allocators.release(self.lo, self.position, i, j)
652
653
	def link(self):
654
		result = []
655
		if self['ip'] and len( self[ 'ip' ] ) > 0 and self['ip'][ 0 ]:
656
			result = [{ 'url': 'https://%s/univention-management-console/' % self['ip'][ 0 ],
657
						'ipaddr': self['ip'][ 0 ],
658
						}]
659
		if self.has_key('dnsEntryZoneForward') and self['dnsEntryZoneForward'] and len( self['dnsEntryZoneForward' ] ) > 0:
660
			zone = univention.admin.uldap.explodeDn( self['dnsEntryZoneForward'][0], 1)[0]
661
			if not result:
662
				result = [ { 'url': 'https://%s.%s/univention-management-console/' % (self['name'], zone) }]
663
			result[0]['fqdn'] = '%s.%s' % (self['name'], zone)
664
		if result:
665
			result[0]['name'] = _('Open Univention Management Console on this computer')
666
			return result
667
		return None
668
669
def rewrite(filter, mapping):
670
	if filter.variable == 'ip':
671
		filter.variable='aRecord'
672
	else:
673
		univention.admin.mapping.mapRewrite(filter, mapping)
674
675
def lookup_filter(filter_s=None, lo=None):
676
	filter_s = univention.admin.filter.replace_fqdn_filter( filter_s )
677
	if str(filter_s).find('(dnsAlias=') != -1:
678
		filter_s = univention.admin.handlers.dns.alias.lookup_alias_filter(lo, filter_s)
679
		if filter_s:
680
			return lookup_filter(filter_s, lo)
681
		else:
682
			return None
683
	lookup_filter_obj = \
684
		univention.admin.filter.conjunction('&', [
685
			univention.admin.filter.expression('objectClass', 'univentionHost'),
686
			univention.admin.filter.expression('objectClass', 'univentionDomainController'),
687
			univention.admin.filter.expression('univentionServerRole', 'backup'),
688
		])
689
690
	# ATTENTION: has its own rewrite function.
691
	lookup_filter_obj.append_unmapped_filter_string(filter_s, rewrite, mapping)
692
	return lookup_filter_obj
693
694
def lookup(co, lo, filter_s, base='', superordinate=None, scope='sub', unique=0, required=0, timeout=-1, sizelimit=0):
695
696
	filter=lookup_filter(filter_s, lo)
697
	if filter is None:
698
		return []
699
	res=[]
700
	for dn, attrs in lo.search(unicode(filter), base, scope, [], unique, required, timeout, sizelimit):
701
		res.append( object( co, lo, None, dn, attributes = attrs ) )
702
	return res
703
704
def identify(dn, attr, canonical=0):
705
	return 'univentionHost' in attr.get('objectClass', []) and 'univentionDomainController' in attr.get('objectClass', []) and 'backup' in attr.get('univentionServerRole', [])
(-)a/management/univention-directory-manager-modules/modules/univention/admin/handlers/computers/domaincontroller_master.py (-304 / +13 lines)
 Lines 30-50    Link Here 
30
# /usr/share/common-licenses/AGPL-3; if not, see
30
# /usr/share/common-licenses/AGPL-3; if not, see
31
# <http://www.gnu.org/licenses/>.
31
# <http://www.gnu.org/licenses/>.
32
32
33
from ldap.filter import filter_format
34
35
from univention.admin.layout import Tab, Group
33
from univention.admin.layout import Tab, Group
36
import univention.admin.filter
34
import univention.admin.filter
37
import univention.admin.handlers
35
import univention.admin.handlers
38
import univention.admin.password
39
import univention.admin.allocators
40
import univention.admin.localization
36
import univention.admin.localization
41
import univention.admin.uldap
42
import univention.admin.nagios as nagios
37
import univention.admin.nagios as nagios
43
import univention.admin.handlers.dns.forward_zone
38
from univention.admin.handlers.computers.base import computerBase
44
import univention.admin.handlers.dns.reverse_zone
45
import univention.admin.handlers.groups.group
46
import univention.admin.handlers.networks.network
47
import time
48
39
49
translation=univention.admin.localization.translation('univention.admin.handlers.computers')
40
translation=univention.admin.localization.translation('univention.admin.handlers.computers')
50
_=translation.translate
41
_=translation.translate
 Lines 402-699    Link Here 
402
nagios.addPropertiesMappingOptionsAndLayout(property_descriptions, mapping, options, layout)
393
nagios.addPropertiesMappingOptionsAndLayout(property_descriptions, mapping, options, layout)
403
394
404
395
405
class object(univention.admin.handlers.simpleComputer, nagios.Support):
396
class object(computerBase):
406
	module=module
397
	module=module
407
398
	mapping = mapping
408
	def __init__(self, co, lo, position, dn='', superordinate=None, attributes = [] ):
399
	CONFIG_NAME = 'univentionDefaultDomainControllerMasterGroup'
409
		univention.admin.handlers.simpleComputer.__init__(self, co, lo, position, dn, superordinate, attributes)
400
	DEFAULT_OCS = ['top', 'person', 'univentionHost', 'univentionDomainController']
410
		nagios.Support.__init__(self)
401
	SAMBA_ACCOUNT_FLAG = 'S'
411
402
	SERVER_TYPE = 'univentionDomainController'
412
	def open(self):
403
	SERVER_ROLE = 'master'
413
		univention.admin.handlers.simpleComputer.open( self )
404
414
		self.nagios_open()
405
rewrite = object.rewrite
415
406
lookup_filter = object.lookup_filter
416
		self.modifypassword=0
407
lookup = object.lookup
417
		if self.exists():
408
identify = object.identify
418
			userPassword=self.oldattr.get('userPassword',[''])[0]
419
			if userPassword:
420
				self.info['password']=userPassword
421
				self.modifypassword=0
422
		if self.exists():
423
424
			if 'posix' in self.options and not self.info.get( 'primaryGroup' ):
425
				primaryGroupNumber=self.oldattr.get('gidNumber',[''])[0]
426
				univention.debug.debug(univention.debug.ADMIN, univention.debug.INFO, 'primary group number = %s' % (primaryGroupNumber))
427
				if primaryGroupNumber:
428
					primaryGroupResult=self.lo.searchDn(filter_format('(&(objectClass=posixGroup)(gidNumber=%s))', [primaryGroupNumber]))
429
					if primaryGroupResult:
430
						self['primaryGroup']=primaryGroupResult[0]
431
						univention.debug.debug(univention.debug.ADMIN, univention.debug.INFO, 'Set primary group = %s' % (self['primaryGroup']))
432
					else:
433
						self['primaryGroup']=None
434
						self.save()
435
						raise univention.admin.uexceptions.primaryGroup
436
				else:
437
					self['primaryGroup']=None
438
					self.save()
439
					raise univention.admin.uexceptions.primaryGroup
440
			if 'samba' in self.options:
441
				sid = self.oldattr.get('sambaSID', [''])[0]
442
				pos = sid.rfind('-')
443
				self.info['sambaRID'] = sid[pos+1:]
444
445
			self.save()
446
		else:
447
			self.modifypassword=0
448
			if 'posix' in self.options:
449
				res=univention.admin.config.getDefaultValue(self.lo, 'univentionDefaultDomainControllerMasterGroup', position=self.position)
450
				if res:
451
					self['primaryGroup']=res
452
453
	def _ldap_pre_create(self):
454
		super(object, self)._ldap_pre_create()
455
		if not self['password']:
456
			self['password']=self.oldattr.get('password',[''])[0]
457
			self.modifypassword=0
458
459
	def _ldap_addlist(self):
460
		ocs=['top', 'person', 'univentionHost', 'univentionDomainController']
461
		al=[]
462
		if 'kerberos' in self.options:
463
			al.append(('krb5MaxLife', '86400'))
464
			al.append(('krb5MaxRenew', '604800'))
465
			al.append(('krb5KDCFlags', '126'))
466
			krb_key_version=str(int(self.oldattr.get('krb5KeyVersionNumber', ['0'])[0])+1)
467
			al.append(('krb5KeyVersionNumber', self.oldattr.get('krb5KeyVersionNumber', []), krb_key_version))
468
469
		if 'posix' in self.options:
470
			self.uidNum=univention.admin.allocators.request(self.lo, self.position, 'uidNumber')
471
			self.alloc.append(('uidNumber',self.uidNum))
472
			gidNum = self.get_gid_for_primary_group()
473
			al.append(('uidNumber', [self.uidNum]))
474
			al.append(('gidNumber', [gidNum]))
475
476
		if self.modifypassword or self['password']:
477
			if 'kerberos' in self.options:
478
				krb_keys=univention.admin.password.krb5_asn1(self.krb5_principal(), self['password'])
479
				al.append(('krb5Key', self.oldattr.get('password', ['1']), krb_keys))
480
			if 'posix' in self.options:
481
				password_crypt = "{crypt}%s" % (univention.admin.password.crypt(self['password']))
482
				al.append(('userPassword', self.oldattr.get('userPassword', [''])[0], password_crypt))
483
			if 'samba' in self.options:
484
				password_nt, password_lm = univention.admin.password.ntlm(self['password'])
485
				al.append(('sambaNTPassword', self.oldattr.get('sambaNTPassword', [''])[0], password_nt))
486
				al.append(('sambaLMPassword', self.oldattr.get('sambaLMPassword', [''])[0], password_lm))
487
				sambaPwdLastSetValue = str(long(time.time()))
488
				al.append(('sambaPwdLastSet', self.oldattr.get('sambaPwdLastSet', [''])[0], sambaPwdLastSetValue))
489
			self.modifypassword=0
490
		if 'samba' in self.options:
491
			acctFlags=univention.admin.samba.acctFlags(flags={'S':1})
492
			if self.s4connector_present:
493
				# In this case Samba 4 must create the SID, the s4 connector will sync the
494
				# new sambaSID back from Samba 4.
495
				self.machineSid='S-1-4-%s' % self.uidNum
496
			else:
497
				self.machineSid = self.getMachineSid(self.lo, self.position, self.uidNum, self.get('sambaRID'))
498
				self.alloc.append(('sid',self.machineSid))
499
			al.append(('sambaSID', [self.machineSid]))
500
			al.append(('sambaAcctFlags', [acctFlags.decode()]))
501
			al.append(('displayName', self.info['name']))
502
503
		al.insert(0, ('objectClass', ocs))
504
		al.append(('univentionServerRole', '', 'master'))
505
		return al
506
507
	def _ldap_post_create(self):
508
		if 'posix' in self.options:
509
			if hasattr(self, 'uid') and self.uid:
510
				univention.admin.allocators.confirm(self.lo, self.position, 'uid', self.uid)
511
			univention.admin.handlers.simpleComputer.primary_group( self )
512
			univention.admin.handlers.simpleComputer.update_groups( self )
513
		univention.admin.handlers.simpleComputer._ldap_post_create( self )
514
		self.nagios_ldap_post_create()
515
516
	def _ldap_pre_remove(self):
517
		self.open()
518
		if 'posix' in self.options and self.oldattr.get( 'uidNumber' ):
519
			self.uidNum=self.oldattr['uidNumber'][0]
520
521
	def _ldap_post_remove(self):
522
		if 'posix' in self.options:
523
			univention.admin.allocators.release(self.lo, self.position, 'uidNumber', self.uidNum)
524
		groupObjects=univention.admin.handlers.groups.group.lookup(self.co, self.lo, filter_s=filter_format('uniqueMember', [self.dn]))
525
		if groupObjects:
526
			for i in range(0, len(groupObjects)):
527
				groupObjects[i].open()
528
				if self.dn in groupObjects[i]['users']:
529
					groupObjects[i]['users'].remove(self.dn)
530
					groupObjects[i].modify(ignore_license=1)
531
532
		self.nagios_ldap_post_remove()
533
		univention.admin.handlers.simpleComputer._ldap_post_remove( self )
534
		# Need to clean up oldinfo. If remove was invoked, because the
535
		# creation of the object has failed, the next try will result in
536
		# a 'object class violation' (Bug #19343)
537
		self.oldinfo = {}
538
539
	def krb5_principal(self):
540
		domain=univention.admin.uldap.domain(self.lo, self.position)
541
		realm=domain.getKerberosRealm()
542
		if self.info.has_key('domain') and self.info['domain']:
543
			kerberos_domain=self.info['domain']
544
		else:
545
			kerberos_domain=domain.getKerberosRealm()
546
		return 'host/' + self['name']+'.'+kerberos_domain.lower()+'@'+realm
547
548
	def _ldap_post_modify(self):
549
		univention.admin.handlers.simpleComputer.primary_group( self )
550
		univention.admin.handlers.simpleComputer.update_groups( self )
551
		univention.admin.handlers.simpleComputer._ldap_post_modify( self )
552
		self.nagios_ldap_post_modify()
553
554
	def _ldap_pre_modify(self):
555
		if self.hasChanged('password'):
556
			if not self['password']:
557
				self['password']=self.oldattr.get('password',[''])[0]
558
				self.modifypassword=0
559
			elif not self.info['password']:
560
				self['password']=self.oldattr.get('password',[''])[0]
561
				self.modifypassword=0
562
			else:
563
				self.modifypassword=1
564
		self.nagios_ldap_pre_modify()
565
		univention.admin.handlers.simpleComputer._ldap_pre_modify( self )
566
567
568
	def _ldap_modlist(self):
569
		ml=univention.admin.handlers.simpleComputer._ldap_modlist( self )
570
571
		self.nagios_ldap_modlist(ml)
572
573
		if self.hasChanged('name'):
574
			if 'posix' in self.options:
575
				if hasattr(self, 'uidNum'):
576
					univention.admin.allocators.confirm(self.lo, self.position, 'uidNumber', self.uidNum)
577
				requested_uid="%s$" % self['name']
578
				try:
579
					self.uid=univention.admin.allocators.request(self.lo, self.position, 'uid', value=requested_uid)
580
				except Exception:
581
					self.cancel()
582
					raise univention.admin.uexceptions.uidAlreadyUsed, ': %s' % requested_uid
583
					return []
584
585
				self.alloc.append(('uid',self.uid))
586
587
				ml.append(('uid', self.oldattr.get('uid', [None])[0], self.uid))
588
589
			if 'samba' in self.options:
590
				ml.append(('displayName', self.oldattr.get('displayName', [None])[0], self['name']))
591
592
			if 'kerberos' in self.options:
593
				ml.append(('krb5PrincipalName', self.oldattr.get('krb5PrincipalName', []), [self.krb5_principal()]))
594
595
		if self.modifypassword and self['password']:
596
			if 'kerberos' in self.options:
597
				krb_keys=univention.admin.password.krb5_asn1(self.krb5_principal(), self['password'])
598
				krb_key_version=str(int(self.oldattr.get('krb5KeyVersionNumber', ['0'])[0])+1)
599
				ml.append(('krb5Key', self.oldattr.get('password', ['1']), krb_keys))
600
				ml.append(('krb5KeyVersionNumber', self.oldattr.get('krb5KeyVersionNumber', []), krb_key_version))
601
			if 'posix' in self.options:
602
				password_crypt = "{crypt}%s" % (univention.admin.password.crypt(self['password']))
603
				ml.append(('userPassword', self.oldattr.get('userPassword', [''])[0], password_crypt))
604
			if 'samba' in self.options:
605
				password_nt, password_lm = univention.admin.password.ntlm(self['password'])
606
				ml.append(('sambaNTPassword', self.oldattr.get('sambaNTPassword', [''])[0], password_nt))
607
				ml.append(('sambaLMPassword', self.oldattr.get('sambaLMPassword', [''])[0], password_lm))
608
				sambaPwdLastSetValue = str(long(time.time()))
609
				ml.append(('sambaPwdLastSet', self.oldattr.get('sambaPwdLastSet', [''])[0], sambaPwdLastSetValue))
610
611
		# add samba option
612
		if self.exists() and self.option_toggled('samba') and 'samba' in self.options:
613
			acctFlags=univention.admin.samba.acctFlags(flags={'S':1})
614
			if self.s4connector_present:
615
				# In this case Samba 4 must create the SID, the s4 connector will sync the
616
				# new sambaSID back from Samba 4.
617
				self.machineSid='S-1-4-%s' % self.oldattr['uidNumber'][0]
618
			else:
619
				self.machineSid = self.getMachineSid(self.lo, self.position, self.oldattr['uidNumber'][0], self.get('sambaRID'))
620
				self.alloc.append(('sid',self.machineSid))
621
			ml.append(('sambaSID', '', [self.machineSid]))
622
			ml.append(('sambaAcctFlags', '', [acctFlags.decode()]))
623
			ml.append(('displayName', '', self.info['name']))
624
			sambaPwdLastSetValue = str(long(time.time()))
625
			ml.append(('sambaPwdLastSet', self.oldattr.get('sambaPwdLastSet', [''])[0], sambaPwdLastSetValue))
626
		if self.exists() and self.option_toggled('samba') and 'samba' not in self.options:
627
			for key in [ 'sambaSID', 'sambaAcctFlags', 'sambaNTPassword', 'sambaLMPassword', 'sambaPwdLastSet', 'displayName' ]:
628
				if self.oldattr.get(key, []):
629
					ml.insert(0, (key, self.oldattr.get(key, []), ''))
630
631
		if self.hasChanged('sambaRID') and not hasattr(self, 'machineSid'):
632
			self.machineSid = self.getMachineSid(self.lo, self.position, self.oldattr['uidNumber'][0], self.get('sambaRID'))
633
			ml.append(('sambaSID', self.oldattr.get('sambaSID', ['']), [self.machineSid]))
634
635
		return ml
636
637
	def cleanup(self):
638
		self.open()
639
		self.nagios_cleanup()
640
		univention.admin.handlers.simpleComputer.cleanup( self )
641
642
	def cancel(self):
643
		for i,j in self.alloc:
644
			univention.debug.debug(univention.debug.ADMIN, univention.debug.WARN, 'cancel: release (%s): %s' % (i,j) )
645
			univention.admin.allocators.release(self.lo, self.position, i, j)
646
647
	def link(self):
648
		result = []
649
		if self['ip'] and len( self[ 'ip' ] ) > 0 and self['ip'][ 0 ]:
650
			result = [{ 'url': 'https://%s/univention-management-console/' % self['ip'][ 0 ],
651
						'ipaddr': self['ip'][ 0 ],
652
						}]
653
		if self.has_key('dnsEntryZoneForward') and self['dnsEntryZoneForward'] and len( self['dnsEntryZoneForward' ] ) > 0:
654
			zone = univention.admin.uldap.explodeDn( self['dnsEntryZoneForward'][0], 1)[0]
655
			if not result:
656
				result = [ { 'url': 'https://%s.%s/univention-management-console/' % (self['name'], zone) }]
657
			result[0]['fqdn'] = '%s.%s' % (self['name'], zone)
658
		if result:
659
			result[0]['name'] = _('Open Univention Management Console on this computer')
660
			return result
661
		return None
662
663
def rewrite(filter, mapping):
664
	if filter.variable == 'ip':
665
		filter.variable='aRecord'
666
	else:
667
		univention.admin.mapping.mapRewrite(filter, mapping)
668
669
def lookup_filter(filter_s=None, lo=None):
670
	filter_s = univention.admin.filter.replace_fqdn_filter( filter_s )
671
	if str(filter_s).find('(dnsAlias=') != -1:
672
		filter_s = univention.admin.handlers.dns.alias.lookup_alias_filter(lo, filter_s)
673
		if filter_s:
674
			return lookup_filter(filter_s, lo)
675
		else:
676
			return None
677
	lookup_filter_obj = \
678
		univention.admin.filter.conjunction('&', [
679
			univention.admin.filter.expression('objectClass', 'univentionHost'),
680
			univention.admin.filter.expression('objectClass', 'univentionDomainController'),
681
			univention.admin.filter.expression('univentionServerRole', 'master'),
682
		])
683
684
	# ATTENTION: has its own rewrite function.
685
	lookup_filter_obj.append_unmapped_filter_string(filter_s, rewrite, mapping)
686
	return lookup_filter_obj
687
688
def lookup(co, lo, filter_s, base='', superordinate=None, scope='sub', unique=0, required=0, timeout=-1, sizelimit=0):
689
690
	filter=lookup_filter(filter_s, lo)
691
	if filter is None:
692
		return []
693
	res=[]
694
	for dn, attrs in lo.search(unicode(filter), base, scope, [], unique, required, timeout, sizelimit):
695
		res.append( object( co, lo, None, dn, attributes = attrs ) )
696
	return res
697
698
def identify(dn, attr, canonical=0):
699
	return 'univentionHost' in attr.get('objectClass', []) and 'univentionDomainController' in attr.get('objectClass', []) and 'master' in attr.get('univentionServerRole', [])
(-)a/management/univention-directory-manager-modules/modules/univention/admin/handlers/computers/domaincontroller_slave.py (-310 / +13 lines)
 Lines 30-50    Link Here 
30
# /usr/share/common-licenses/AGPL-3; if not, see
30
# /usr/share/common-licenses/AGPL-3; if not, see
31
# <http://www.gnu.org/licenses/>.
31
# <http://www.gnu.org/licenses/>.
32
32
33
from ldap.filter import filter_format
34
35
from univention.admin.layout import Tab, Group
33
from univention.admin.layout import Tab, Group
36
import univention.admin.filter
34
import univention.admin.filter
37
import univention.admin.handlers
35
import univention.admin.handlers
38
import univention.admin.password
39
import univention.admin.allocators
40
import univention.admin.localization
36
import univention.admin.localization
41
import univention.admin.uldap
42
import univention.admin.nagios as nagios
37
import univention.admin.nagios as nagios
43
import univention.admin.handlers.dns.forward_zone
38
from univention.admin.handlers.computers.base import computerBase
44
import univention.admin.handlers.dns.reverse_zone
45
import univention.admin.handlers.groups.group
46
import univention.admin.handlers.networks.network
47
import time
48
39
49
translation=univention.admin.localization.translation('univention.admin.handlers.computers')
40
translation=univention.admin.localization.translation('univention.admin.handlers.computers')
50
_=translation.translate
41
_=translation.translate
 Lines 402-705    Link Here 
402
nagios.addPropertiesMappingOptionsAndLayout(property_descriptions, mapping, options, layout)
393
nagios.addPropertiesMappingOptionsAndLayout(property_descriptions, mapping, options, layout)
403
394
404
395
405
class object(univention.admin.handlers.simpleComputer, nagios.Support):
396
class object(computerBase):
406
	module=module
397
	module=module
407
398
	mapping = mapping
408
	def __init__(self, co, lo, position, dn='', superordinate=None, attributes = [] ):
399
	CONFIG_NAME = 'univentionDefaultDomainControllerGroup'
409
		univention.admin.handlers.simpleComputer.__init__(self, co, lo, position, dn, superordinate, attributes)
400
	DEFAULT_OCS = ['top', 'person', 'univentionHost', 'univentionDomainController']
410
		nagios.Support.__init__(self)
401
	SAMBA_ACCOUNT_FLAG = 'S'
411
402
	SERVER_TYPE = 'univentionDomainController'
412
	def open(self):
403
	SERVER_ROLE = 'slave'
413
		univention.admin.handlers.simpleComputer.open( self )
404
414
		self.nagios_open()
405
rewrite = object.rewrite
415
406
lookup_filter = object.lookup_filter
416
		self.modifypassword=0
407
lookup = object.lookup
417
		if self.exists():
408
identify = object.identify
418
			userPassword=self.oldattr.get('userPassword',[''])[0]
419
			if userPassword:
420
				self.info['password']=userPassword
421
				self.modifypassword=0
422
		if self.exists():
423
424
			if 'posix' in self.options and not self.info.get( 'primaryGroup' ):
425
				primaryGroupNumber=self.oldattr.get('gidNumber',[''])[0]
426
				univention.debug.debug(univention.debug.ADMIN, univention.debug.INFO, 'primary group number = %s' % (primaryGroupNumber))
427
				if primaryGroupNumber:
428
					primaryGroupResult=self.lo.searchDn(filter_format('(&(objectClass=posixGroup)(gidNumber=%s))', [primaryGroupNumber]))
429
					if primaryGroupResult:
430
						self['primaryGroup']=primaryGroupResult[0]
431
						univention.debug.debug(univention.debug.ADMIN, univention.debug.INFO, 'Set primary group = %s' % (self['primaryGroup']))
432
					else:
433
						self['primaryGroup']=None
434
						self.save()
435
						raise univention.admin.uexceptions.primaryGroup
436
				else:
437
					self['primaryGroup']=None
438
					self.save()
439
					raise univention.admin.uexceptions.primaryGroup
440
			if 'samba' in self.options:
441
				sid = self.oldattr.get('sambaSID', [''])[0]
442
				pos = sid.rfind('-')
443
				self.info['sambaRID'] = sid[pos+1:]
444
445
			self.save()
446
		else:
447
			self.modifypassword=0
448
			if 'posix' in self.options:
449
				res=univention.admin.config.getDefaultValue(self.lo, 'univentionDefaultDomainControllerGroup', position=self.position)
450
				if res:
451
					self['primaryGroup']=res
452
453
	def _ldap_pre_create(self):
454
		super(object, self)._ldap_pre_create()
455
		if not self['password']:
456
			self['password']=self.oldattr.get('password',[''])[0]
457
			self.modifypassword=0
458
459
	def _ldap_addlist(self):
460
		ocs=['top', 'person', 'univentionHost', 'univentionDomainController']
461
		al=[]
462
		if 'kerberos' in self.options:
463
			domain=univention.admin.uldap.domain(self.lo, self.position)
464
			realm=domain.getKerberosRealm()
465
466
			if realm:
467
				al.append(('krb5MaxLife', '86400'))
468
				al.append(('krb5MaxRenew', '604800'))
469
				al.append(('krb5KDCFlags', '126'))
470
				krb_key_version=str(int(self.oldattr.get('krb5KeyVersionNumber', ['0'])[0])+1)
471
				al.append(('krb5KeyVersionNumber', self.oldattr.get('krb5KeyVersionNumber', []), krb_key_version))
472
			else:
473
				# can't do kerberos
474
				self._remove_option( 'kerberos' )
475
		if 'posix' in self.options:
476
			self.uidNum=univention.admin.allocators.request(self.lo, self.position, 'uidNumber')
477
			self.alloc.append(('uidNumber',self.uidNum))
478
			gidNum = self.get_gid_for_primary_group()
479
			al.append(('uidNumber', [self.uidNum]))
480
			al.append(('gidNumber', [gidNum]))
481
482
		if self.modifypassword or self['password']:
483
			if 'kerberos' in self.options:
484
				krb_keys=univention.admin.password.krb5_asn1(self.krb5_principal(), self['password'])
485
				al.append(('krb5Key', self.oldattr.get('password', ['1']), krb_keys))
486
			if 'posix' in self.options:
487
				password_crypt = "{crypt}%s" % (univention.admin.password.crypt(self['password']))
488
				al.append(('userPassword', self.oldattr.get('userPassword', [''])[0], password_crypt))
489
			if 'samba' in self.options:
490
				password_nt, password_lm = univention.admin.password.ntlm(self['password'])
491
				al.append(('sambaNTPassword', self.oldattr.get('sambaNTPassword', [''])[0], password_nt))
492
				al.append(('sambaLMPassword', self.oldattr.get('sambaLMPassword', [''])[0], password_lm))
493
				sambaPwdLastSetValue = str(long(time.time()))
494
				al.append(('sambaPwdLastSet', self.oldattr.get('sambaPwdLastSet', [''])[0], sambaPwdLastSetValue))
495
			self.modifypassword=0
496
		if 'samba' in self.options:
497
			acctFlags=univention.admin.samba.acctFlags(flags={'S':1})
498
			if self.s4connector_present:
499
				# In this case Samba 4 must create the SID, the s4 connector will sync the
500
				# new sambaSID back from Samba 4.
501
				self.machineSid='S-1-4-%s' % self.uidNum
502
			else:
503
				self.machineSid = self.getMachineSid(self.lo, self.position, self.uidNum, self.get('sambaRID'))
504
				self.alloc.append(('sid',self.machineSid))
505
			al.append(('sambaSID', [self.machineSid]))
506
			al.append(('sambaAcctFlags', [acctFlags.decode()]))
507
			al.append(('displayName', self.info['name']))
508
509
		al.insert(0, ('objectClass', ocs))
510
		al.append(('univentionServerRole', '', 'slave'))
511
		return al
512
513
	def _ldap_post_create(self):
514
		if 'posix' in self.options:
515
			if hasattr(self, 'uid') and self.uid:
516
				univention.admin.allocators.confirm(self.lo, self.position, 'uid', self.uid)
517
			univention.admin.handlers.simpleComputer.primary_group( self )
518
			univention.admin.handlers.simpleComputer.update_groups( self )
519
		univention.admin.handlers.simpleComputer._ldap_post_create( self )
520
		self.nagios_ldap_post_create()
521
522
	def _ldap_pre_remove(self):
523
		self.open()
524
		if 'posix' in self.options and self.oldattr.get( 'uidNumber' ):
525
			self.uidNum=self.oldattr['uidNumber'][0]
526
527
	def _ldap_post_remove(self):
528
		if 'posix' in self.options:
529
			univention.admin.allocators.release(self.lo, self.position, 'uidNumber', self.uidNum)
530
		groupObjects=univention.admin.handlers.groups.group.lookup(self.co, self.lo, filter_s=filter_format('uniqueMember', [self.dn]))
531
		if groupObjects:
532
			for i in range(0, len(groupObjects)):
533
				groupObjects[i].open()
534
				if self.dn in groupObjects[i]['users']:
535
					groupObjects[i]['users'].remove(self.dn)
536
					groupObjects[i].modify(ignore_license=1)
537
538
		self.nagios_ldap_post_remove()
539
		univention.admin.handlers.simpleComputer._ldap_post_remove( self )
540
		# Need to clean up oldinfo. If remove was invoked, because the
541
		# creation of the object has failed, the next try will result in
542
		# a 'object class violation' (Bug #19343)
543
		self.oldinfo = {}
544
545
	def krb5_principal(self):
546
		domain=univention.admin.uldap.domain(self.lo, self.position)
547
		realm=domain.getKerberosRealm()
548
		if self.info.has_key('domain') and self.info['domain']:
549
			kerberos_domain=self.info['domain']
550
		else:
551
			kerberos_domain=domain.getKerberosRealm()
552
		return 'host/' + self['name']+'.'+kerberos_domain.lower()+'@'+realm
553
554
	def _ldap_post_modify(self):
555
		univention.admin.handlers.simpleComputer.primary_group( self )
556
		univention.admin.handlers.simpleComputer.update_groups( self )
557
		univention.admin.handlers.simpleComputer._ldap_post_modify( self )
558
		self.nagios_ldap_post_modify()
559
560
	def _ldap_pre_modify(self):
561
		if self.hasChanged('password'):
562
			if not self['password']:
563
				self['password']=self.oldattr.get('password',[''])[0]
564
				self.modifypassword=0
565
			elif not self.info['password']:
566
				self['password']=self.oldattr.get('password',[''])[0]
567
				self.modifypassword=0
568
			else:
569
				self.modifypassword=1
570
		self.nagios_ldap_pre_modify()
571
		univention.admin.handlers.simpleComputer._ldap_pre_modify( self )
572
573
574
	def _ldap_modlist(self):
575
		ml=univention.admin.handlers.simpleComputer._ldap_modlist( self )
576
577
		self.nagios_ldap_modlist(ml)
578
579
		if self.hasChanged('name'):
580
			if 'posix' in self.options:
581
				if hasattr(self, 'uidNum'):
582
					univention.admin.allocators.confirm(self.lo, self.position, 'uidNumber', self.uidNum)
583
				requested_uid="%s$" % self['name']
584
				try:
585
					self.uid=univention.admin.allocators.request(self.lo, self.position, 'uid', value=requested_uid)
586
				except Exception:
587
					self.cancel()
588
					raise univention.admin.uexceptions.uidAlreadyUsed, ': %s' % requested_uid
589
					return []
590
591
				self.alloc.append(('uid',self.uid))
592
593
				ml.append(('uid', self.oldattr.get('uid', [None])[0], self.uid))
594
595
			if 'samba' in self.options:
596
				ml.append(('displayName', self.oldattr.get('displayName', [None])[0], self['name']))
597
598
			if 'kerberos' in self.options:
599
				ml.append(('krb5PrincipalName', self.oldattr.get('krb5PrincipalName', []), [self.krb5_principal()]))
600
601
		if self.modifypassword and self['password']:
602
			if 'kerberos' in self.options:
603
				krb_keys=univention.admin.password.krb5_asn1(self.krb5_principal(), self['password'])
604
				krb_key_version=str(int(self.oldattr.get('krb5KeyVersionNumber', ['0'])[0])+1)
605
				ml.append(('krb5Key', self.oldattr.get('password', ['1']), krb_keys))
606
				ml.append(('krb5KeyVersionNumber', self.oldattr.get('krb5KeyVersionNumber', []), krb_key_version))
607
			if 'posix' in self.options:
608
				password_crypt = "{crypt}%s" % (univention.admin.password.crypt(self['password']))
609
				ml.append(('userPassword', self.oldattr.get('userPassword', [''])[0], password_crypt))
610
			if 'samba' in self.options:
611
				password_nt, password_lm = univention.admin.password.ntlm(self['password'])
612
				ml.append(('sambaNTPassword', self.oldattr.get('sambaNTPassword', [''])[0], password_nt))
613
				ml.append(('sambaLMPassword', self.oldattr.get('sambaLMPassword', [''])[0], password_lm))
614
				sambaPwdLastSetValue = str(long(time.time()))
615
				ml.append(('sambaPwdLastSet', self.oldattr.get('sambaPwdLastSet', [''])[0], sambaPwdLastSetValue))
616
617
		# add samba option
618
		if self.exists() and self.option_toggled('samba') and 'samba' in self.options:
619
			acctFlags=univention.admin.samba.acctFlags(flags={'S':1})
620
			if self.s4connector_present:
621
				# In this case Samba 4 must create the SID, the s4 connector will sync the
622
				# new sambaSID back from Samba 4.
623
				self.machineSid='S-1-4-%s' % self.oldattr['uidNumber'][0]
624
			else:
625
				self.machineSid = self.getMachineSid(self.lo, self.position, self.oldattr['uidNumber'][0], self.get('sambaRID'))
626
				self.alloc.append(('sid',self.machineSid))
627
			ml.append(('sambaSID', '', [self.machineSid]))
628
			ml.append(('sambaAcctFlags', '', [acctFlags.decode()]))
629
			ml.append(('displayName', '', self.info['name']))
630
			sambaPwdLastSetValue = str(long(time.time()))
631
			ml.append(('sambaPwdLastSet', self.oldattr.get('sambaPwdLastSet', [''])[0], sambaPwdLastSetValue))
632
		if self.exists() and self.option_toggled('samba') and 'samba' not in self.options:
633
			for key in [ 'sambaSID', 'sambaAcctFlags', 'sambaNTPassword', 'sambaLMPassword', 'sambaPwdLastSet', 'displayName' ]:
634
				if self.oldattr.get(key, []):
635
					ml.insert(0, (key, self.oldattr.get(key, []), ''))
636
637
		if self.hasChanged('sambaRID') and not hasattr(self, 'machineSid'):
638
			self.machineSid = self.getMachineSid(self.lo, self.position, self.oldattr['uidNumber'][0], self.get('sambaRID'))
639
			ml.append(('sambaSID', self.oldattr.get('sambaSID', ['']), [self.machineSid]))
640
641
		return ml
642
643
	def cleanup(self):
644
		self.open()
645
		self.nagios_cleanup()
646
		univention.admin.handlers.simpleComputer.cleanup( self )
647
648
	def cancel(self):
649
		for i,j in self.alloc:
650
			univention.debug.debug(univention.debug.ADMIN, univention.debug.WARN, 'cancel: release (%s): %s' % (i,j) )
651
			univention.admin.allocators.release(self.lo, self.position, i, j)
652
653
	def link(self):
654
		result = []
655
		if self['ip'] and len( self[ 'ip' ] ) > 0 and self['ip'][ 0 ]:
656
			result = [{ 'url': 'https://%s/univention-management-console/' % self['ip'][ 0 ],
657
						'ipaddr': self['ip'][ 0 ],
658
						}]
659
		if self.has_key('dnsEntryZoneForward') and self['dnsEntryZoneForward'] and len( self['dnsEntryZoneForward' ] ) > 0:
660
			zone = univention.admin.uldap.explodeDn( self['dnsEntryZoneForward'][0], 1)[0]
661
			if not result:
662
				result = [ { 'url': 'https://%s.%s/univention-management-console/' % (self['name'], zone) }]
663
			result[0]['fqdn'] = '%s.%s' % (self['name'], zone)
664
		if result:
665
			result[0]['name'] = _('Open Univention Management Console on this computer')
666
			return result
667
		return None
668
669
def rewrite(filter, mapping):
670
	if filter.variable == 'ip':
671
		filter.variable='aRecord'
672
	else:
673
		univention.admin.mapping.mapRewrite(filter, mapping)
674
675
def lookup_filter(filter_s=None, lo=None):
676
	filter_s = univention.admin.filter.replace_fqdn_filter( filter_s )
677
	if str(filter_s).find('(dnsAlias=') != -1:
678
		filter_s = univention.admin.handlers.dns.alias.lookup_alias_filter(lo, filter_s)
679
		if filter_s:
680
			return lookup_filter(filter_s, lo)
681
		else:
682
			return None
683
	lookup_filter_obj = \
684
		univention.admin.filter.conjunction('&', [
685
			univention.admin.filter.expression('objectClass', 'univentionHost'),
686
			univention.admin.filter.expression('objectClass', 'univentionDomainController'),
687
			univention.admin.filter.expression('univentionServerRole', 'slave'),
688
		])
689
690
	# ATTENTION: has its own rewrite function.
691
	lookup_filter_obj.append_unmapped_filter_string(filter_s, rewrite, mapping)
692
	return lookup_filter_obj
693
694
def lookup(co, lo, filter_s, base='', superordinate=None, scope='sub', unique=0, required=0, timeout=-1, sizelimit=0):
695
696
	filter=lookup_filter(filter_s, lo)
697
	if filter is None:
698
		return []
699
	res=[]
700
	for dn, attrs in lo.search(unicode(filter), base, scope, [], unique, required, timeout, sizelimit):
701
		res.append( object( co, lo, None, dn, attributes = attrs ) )
702
	return res
703
704
def identify(dn, attr, canonical=0):
705
	return 'univentionHost' in attr.get('objectClass', []) and 'univentionDomainController' in attr.get('objectClass', []) and 'slave' in attr.get('univentionServerRole', [])
(-)a/management/univention-directory-manager-modules/modules/univention/admin/handlers/computers/linux.py (-261 / +10 lines)
 Lines 30-50    Link Here 
30
# /usr/share/common-licenses/AGPL-3; if not, see
30
# /usr/share/common-licenses/AGPL-3; if not, see
31
# <http://www.gnu.org/licenses/>.
31
# <http://www.gnu.org/licenses/>.
32
32
33
from ldap.filter import filter_format
34
35
from univention.admin.layout import Tab, Group
33
from univention.admin.layout import Tab, Group
36
import univention.admin.filter
34
import univention.admin.filter
37
import univention.admin.handlers
35
import univention.admin.handlers
38
import univention.admin.password
39
import univention.admin.allocators
40
import univention.admin.localization
36
import univention.admin.localization
41
import univention.admin.uldap
42
import univention.admin.nagios as nagios
37
import univention.admin.nagios as nagios
43
import univention.admin.handlers.dns.forward_zone
38
from univention.admin.handlers.computers.base import computerBase
44
import univention.admin.handlers.dns.reverse_zone
45
import univention.admin.handlers.groups.group
46
import univention.admin.handlers.networks.network
47
import time
48
39
49
translation=univention.admin.localization.translation('univention.admin.handlers.computers')
40
translation=univention.admin.localization.translation('univention.admin.handlers.computers')
50
_=translation.translate
41
_=translation.translate
 Lines 341-603    Link Here 
341
nagios.addPropertiesMappingOptionsAndLayout(property_descriptions, mapping, options, layout)
332
nagios.addPropertiesMappingOptionsAndLayout(property_descriptions, mapping, options, layout)
342
333
343
334
344
class object(univention.admin.handlers.simpleComputer, nagios.Support):
335
class object(computerBase):
345
	module=module
336
	module=module
337
	mapping = mapping
338
	CONFIG_NAME = 'univentionDefaultClientGroup'
339
	DEFAULT_OCS = ['top', 'person', 'univentionHost', 'univentionLinuxClient']
340
	SAMBA_ACCOUNT_FLAG = 'W'
341
	SERVER_TYPE = 'univentionLinuxClient'
346
342
347
	def __init__(self, co, lo, position, dn='', superordinate=None, attributes = [] ):
343
	def check_required_options(self):
348
		univention.admin.handlers.simpleComputer.__init__(self, co, lo, position, dn, superordinate, attributes)
349
		nagios.Support.__init__(self)
350
351
	def open(self):
352
		univention.admin.handlers.simpleComputer.open( self )
353
		self.nagios_open()
354
355
		self.modifypassword=0
356
		if self.exists():
357
			userPassword=self.oldattr.get('userPassword',[''])[0]
358
			if userPassword:
359
				self.info['password']=userPassword
360
				self.modifypassword=0
361
		if self.exists():
362
363
			if 'posix' in self.options and not self.info.get( 'primaryGroup' ):
364
				primaryGroupNumber=self.oldattr.get('gidNumber',[''])[0]
365
				univention.debug.debug(univention.debug.ADMIN, univention.debug.INFO, 'primary group number = %s' % (primaryGroupNumber))
366
				if primaryGroupNumber:
367
					primaryGroupResult=self.lo.searchDn(filter_format('(&(objectClass=posixGroup)(gidNumber=%s))', [primaryGroupNumber]))
368
					if primaryGroupResult:
369
						self['primaryGroup']=primaryGroupResult[0]
370
						univention.debug.debug(univention.debug.ADMIN, univention.debug.INFO, 'Set primary group = %s' % (self['primaryGroup']))
371
					else:
372
						self['primaryGroup']=None
373
						self.save()
374
						raise univention.admin.uexceptions.primaryGroup
375
				else:
376
					self['primaryGroup']=None
377
					self.save()
378
					raise univention.admin.uexceptions.primaryGroup
379
			if 'samba' in self.options:
380
				sid = self.oldattr.get('sambaSID', [''])[0]
381
				pos = sid.rfind('-')
382
				self.info['sambaRID'] = sid[pos+1:]
383
384
			self.save()
385
		else:
386
			self.modifypassword=0
387
			if 'posix' in self.options:
388
				res=univention.admin.config.getDefaultValue(self.lo, 'univentionDefaultClientGroup', position=self.position)
389
				if res:
390
					self['primaryGroup']=res
391
392
	def _ldap_pre_create(self):
393
		super(object, self)._ldap_pre_create()
394
		if not self['password']:
395
			self['password']=self.oldattr.get('password',[''])[0]
396
			self.modifypassword=0
397
398
	def _ldap_addlist(self):
399
		if not set(self.options) & set(['posix', 'kerberos']):
344
		if not set(self.options) & set(['posix', 'kerberos']):
400
			raise univention.admin.uexceptions.invalidOptions(_(' At least posix or kerberos is required.'))
345
			raise univention.admin.uexceptions.invalidOptions(_(' At least posix or kerberos is required.'))
346
del object.link
401
347
402
		ocs=['top', 'person', 'univentionHost', 'univentionLinuxClient']
348
rewrite = object.rewrite
403
		al=[]
404
		if 'kerberos' in self.options:
405
			domain=univention.admin.uldap.domain(self.lo, self.position)
406
			realm=domain.getKerberosRealm()
407
408
			if realm:
409
				al.append(('krb5MaxLife', '86400'))
410
				al.append(('krb5MaxRenew', '604800'))
411
				al.append(('krb5KDCFlags', '126'))
412
				krb_key_version=str(int(self.oldattr.get('krb5KeyVersionNumber', ['0'])[0])+1)
413
				al.append(('krb5KeyVersionNumber', self.oldattr.get('krb5KeyVersionNumber', []), krb_key_version))
414
			else:
415
				# can't do kerberos
416
				self._remove_option( 'kerberos' )
417
		if 'posix' in self.options:
418
			self.uidNum=univention.admin.allocators.request(self.lo, self.position, 'uidNumber')
419
			self.alloc.append(('uidNumber',self.uidNum))
420
			gidNum = self.get_gid_for_primary_group()
421
			al.append(('uidNumber', [self.uidNum]))
422
			al.append(('gidNumber', [gidNum]))
423
424
		if self.modifypassword or self['password']:
425
			if 'kerberos' in self.options:
426
				krb_keys=univention.admin.password.krb5_asn1(self.krb5_principal(), self['password'])
427
				al.append(('krb5Key', self.oldattr.get('password', ['1']), krb_keys))
428
			if 'posix' in self.options:
429
				password_crypt = "{crypt}%s" % (univention.admin.password.crypt(self['password']))
430
				al.append(('userPassword', self.oldattr.get('userPassword', [''])[0], password_crypt))
431
			if 'samba' in self.options:
432
				password_nt, password_lm = univention.admin.password.ntlm(self['password'])
433
				al.append(('sambaNTPassword', self.oldattr.get('sambaNTPassword', [''])[0], password_nt))
434
				al.append(('sambaLMPassword', self.oldattr.get('sambaLMPassword', [''])[0], password_lm))
435
				sambaPwdLastSetValue = str(long(time.time()))
436
				al.append(('sambaPwdLastSet', self.oldattr.get('sambaPwdLastSet', [''])[0], sambaPwdLastSetValue))
437
			self.modifypassword=0
438
		if 'samba' in self.options:
439
			acctFlags=univention.admin.samba.acctFlags(flags={'W':1})
440
			if self.s4connector_present:
441
				# In this case Samba 4 must create the SID, the s4 connector will sync the
442
				# new sambaSID back from Samba 4.
443
				self.machineSid='S-1-4-%s' % self.uidNum
444
			else:
445
				self.machineSid = self.getMachineSid(self.lo, self.position, self.uidNum, self.get('sambaRID'))
446
				self.alloc.append(('sid',self.machineSid))
447
			al.append(('sambaSID', [self.machineSid]))
448
			al.append(('sambaAcctFlags', [acctFlags.decode()]))
449
			al.append(('displayName', self.info['name']))
450
451
		al.insert(0, ('objectClass', ocs))
452
453
		return al
454
455
	def _ldap_post_create(self):
456
		if 'posix' in self.options:
457
			if hasattr(self, 'uid') and self.uid:
458
				univention.admin.allocators.confirm(self.lo, self.position, 'uid', self.uid)
459
			univention.admin.handlers.simpleComputer.primary_group( self )
460
			univention.admin.handlers.simpleComputer.update_groups( self )
461
		univention.admin.handlers.simpleComputer._ldap_post_create( self )
462
		self.nagios_ldap_post_create()
463
464
	def _ldap_pre_remove(self):
465
		self.open()
466
		if 'posix' in self.options and self.oldattr.get( 'uidNumber' ):
467
			self.uidNum=self.oldattr['uidNumber'][0]
468
469
	def _ldap_post_remove(self):
470
		if 'posix' in self.options:
471
			univention.admin.allocators.release(self.lo, self.position, 'uidNumber', self.uidNum)
472
		groupObjects=univention.admin.handlers.groups.group.lookup(self.co, self.lo, filter_s=filter_format('uniqueMember', [self.dn]))
473
		if groupObjects:
474
			for i in range(0, len(groupObjects)):
475
				groupObjects[i].open()
476
				if self.dn in groupObjects[i]['users']:
477
					groupObjects[i]['users'].remove(self.dn)
478
					groupObjects[i].modify(ignore_license=1)
479
480
		self.nagios_ldap_post_remove()
481
		univention.admin.handlers.simpleComputer._ldap_post_remove( self )
482
		# Need to clean up oldinfo. If remove was invoked, because the
483
		# creation of the object has failed, the next try will result in
484
		# a 'object class violation' (Bug #19343)
485
		self.oldinfo = {}
486
487
	def krb5_principal(self):
488
		domain=univention.admin.uldap.domain(self.lo, self.position)
489
		realm=domain.getKerberosRealm()
490
		if self.info.has_key('domain') and self.info['domain']:
491
			kerberos_domain=self.info['domain']
492
		else:
493
			kerberos_domain=domain.getKerberosRealm()
494
		return 'host/' + self['name']+'.'+kerberos_domain.lower()+'@'+realm
495
496
	def _ldap_post_modify(self):
497
		univention.admin.handlers.simpleComputer.primary_group( self )
498
		univention.admin.handlers.simpleComputer.update_groups( self )
499
		univention.admin.handlers.simpleComputer._ldap_post_modify( self )
500
		self.nagios_ldap_post_modify()
501
349
502
	def _ldap_pre_modify(self):
503
		if self.hasChanged('password'):
504
			if not self['password']:
505
				self['password']=self.oldattr.get('password',[''])[0]
506
				self.modifypassword=0
507
			elif not self.info['password']:
508
				self['password']=self.oldattr.get('password',[''])[0]
509
				self.modifypassword=0
510
			else:
511
				self.modifypassword=1
512
		self.nagios_ldap_pre_modify()
513
		univention.admin.handlers.simpleComputer._ldap_pre_modify( self )
514
515
516
	def _ldap_modlist(self):
517
		ml=univention.admin.handlers.simpleComputer._ldap_modlist( self )
518
519
		self.nagios_ldap_modlist(ml)
520
521
		if self.hasChanged('name'):
522
			if 'posix' in self.options:
523
				if hasattr(self, 'uidNum'):
524
					univention.admin.allocators.confirm(self.lo, self.position, 'uidNumber', self.uidNum)
525
				requested_uid="%s$" % self['name']
526
				try:
527
					self.uid=univention.admin.allocators.request(self.lo, self.position, 'uid', value=requested_uid)
528
				except Exception:
529
					self.cancel()
530
					raise univention.admin.uexceptions.uidAlreadyUsed, ': %s' % requested_uid
531
					return []
532
533
				self.alloc.append(('uid',self.uid))
534
535
				ml.append(('uid', self.oldattr.get('uid', [None])[0], self.uid))
536
537
			if 'samba' in self.options:
538
				ml.append(('displayName', self.oldattr.get('displayName', [None])[0], self['name']))
539
540
			if 'kerberos' in self.options:
541
				ml.append(('krb5PrincipalName', self.oldattr.get('krb5PrincipalName', []), [self.krb5_principal()]))
542
543
		if self.modifypassword and self['password']:
544
			if 'kerberos' in self.options:
545
				krb_keys=univention.admin.password.krb5_asn1(self.krb5_principal(), self['password'])
546
				krb_key_version=str(int(self.oldattr.get('krb5KeyVersionNumber', ['0'])[0])+1)
547
				ml.append(('krb5Key', self.oldattr.get('password', ['1']), krb_keys))
548
				ml.append(('krb5KeyVersionNumber', self.oldattr.get('krb5KeyVersionNumber', []), krb_key_version))
549
			if 'posix' in self.options:
550
				password_crypt = "{crypt}%s" % (univention.admin.password.crypt(self['password']))
551
				ml.append(('userPassword', self.oldattr.get('userPassword', [''])[0], password_crypt))
552
			if 'samba' in self.options:
553
				password_nt, password_lm = univention.admin.password.ntlm(self['password'])
554
				ml.append(('sambaNTPassword', self.oldattr.get('sambaNTPassword', [''])[0], password_nt))
555
				ml.append(('sambaLMPassword', self.oldattr.get('sambaLMPassword', [''])[0], password_lm))
556
				sambaPwdLastSetValue = str(long(time.time()))
557
				ml.append(('sambaPwdLastSet', self.oldattr.get('sambaPwdLastSet', [''])[0], sambaPwdLastSetValue))
558
559
		# add samba option
560
		if self.exists() and self.option_toggled('samba') and 'samba' in self.options:
561
			acctFlags=univention.admin.samba.acctFlags(flags={'W':1})
562
			if self.s4connector_present:
563
				# In this case Samba 4 must create the SID, the s4 connector will sync the
564
				# new sambaSID back from Samba 4.
565
				self.machineSid='S-1-4-%s' % self.oldattr['uidNumber'][0]
566
			else:
567
				self.machineSid = self.getMachineSid(self.lo, self.position, self.oldattr['uidNumber'][0], self.get('sambaRID'))
568
				self.alloc.append(('sid',self.machineSid))
569
			ml.append(('sambaSID', '', [self.machineSid]))
570
			ml.append(('sambaAcctFlags', '', [acctFlags.decode()]))
571
			ml.append(('displayName', '', self.info['name']))
572
			sambaPwdLastSetValue = str(long(time.time()))
573
			ml.append(('sambaPwdLastSet', self.oldattr.get('sambaPwdLastSet', [''])[0], sambaPwdLastSetValue))
574
		if self.exists() and self.option_toggled('samba') and 'samba' not in self.options:
575
			for key in [ 'sambaSID', 'sambaAcctFlags', 'sambaNTPassword', 'sambaLMPassword', 'sambaPwdLastSet', 'displayName' ]:
576
				if self.oldattr.get(key, []):
577
					ml.insert(0, (key, self.oldattr.get(key, []), ''))
578
579
		if self.hasChanged('sambaRID') and not hasattr(self, 'machineSid'):
580
			self.machineSid = self.getMachineSid(self.lo, self.position, self.oldattr['uidNumber'][0], self.get('sambaRID'))
581
			ml.append(('sambaSID', self.oldattr.get('sambaSID', ['']), [self.machineSid]))
582
583
		return ml
584
585
	def cleanup(self):
586
		self.open()
587
		self.nagios_cleanup()
588
		univention.admin.handlers.simpleComputer.cleanup( self )
589
590
	def cancel(self):
591
		for i,j in self.alloc:
592
			univention.debug.debug(univention.debug.ADMIN, univention.debug.WARN, 'cancel: release (%s): %s' % (i,j) )
593
			univention.admin.allocators.release(self.lo, self.position, i, j)
594
595
596
def rewrite(filter, mapping):
597
	if filter.variable == 'ip':
598
		filter.variable='aRecord'
599
	else:
600
		univention.admin.mapping.mapRewrite(filter, mapping)
601
350
602
def lookup(co, lo, filter_s, base='', superordinate=None, scope='sub', unique=0, required=0, timeout=-1, sizelimit=0):
351
def lookup(co, lo, filter_s, base='', superordinate=None, scope='sub', unique=0, required=0, timeout=-1, sizelimit=0):
603
352
(-)a/management/univention-directory-manager-modules/modules/univention/admin/handlers/computers/macos.py (-268 / +12 lines)
 Lines 30-50    Link Here 
30
# /usr/share/common-licenses/AGPL-3; if not, see
30
# /usr/share/common-licenses/AGPL-3; if not, see
31
# <http://www.gnu.org/licenses/>.
31
# <http://www.gnu.org/licenses/>.
32
32
33
from ldap.filter import filter_format
34
35
from univention.admin.layout import Tab, Group
33
from univention.admin.layout import Tab, Group
36
import univention.admin.filter
34
import univention.admin.filter
37
import univention.admin.handlers
35
import univention.admin.handlers
38
import univention.admin.password
39
import univention.admin.allocators
40
import univention.admin.localization
36
import univention.admin.localization
41
import univention.admin.uldap
42
import univention.admin.nagios as nagios
37
import univention.admin.nagios as nagios
43
import univention.admin.handlers.dns.forward_zone
38
from univention.admin.handlers.computers.base import computerBase
44
import univention.admin.handlers.dns.reverse_zone
45
import univention.admin.handlers.groups.group
46
import univention.admin.handlers.networks.network
47
import time
48
39
49
translation=univention.admin.localization.translation('univention.admin.handlers.computers')
40
translation=univention.admin.localization.translation('univention.admin.handlers.computers')
50
_=translation.translate
41
_=translation.translate
 Lines 329-600    Link Here 
329
mapping=univention.admin.mapping.mapping()
320
mapping=univention.admin.mapping.mapping()
330
mapping.register('name', 'cn', None, univention.admin.mapping.ListToString)
321
mapping.register('name', 'cn', None, univention.admin.mapping.ListToString)
331
mapping.register('description', 'description', None, univention.admin.mapping.ListToString)
322
mapping.register('description', 'description', None, univention.admin.mapping.ListToString)
332
mapping.register('operatingSystem', 'univentionOperatingSystem', None, univention.admin.mapping.ListToString)
333
mapping.register('operatingSystemVersion', 'univentionOperatingSystemVersion', None, univention.admin.mapping.ListToString)
334
mapping.register('domain', 'associatedDomain', None, univention.admin.mapping.ListToString)
323
mapping.register('domain', 'associatedDomain', None, univention.admin.mapping.ListToString)
335
mapping.register('inventoryNumber', 'univentionInventoryNumber')
324
mapping.register('inventoryNumber', 'univentionInventoryNumber')
336
mapping.register('mac', 'macAddress' )
325
mapping.register('mac', 'macAddress' )
337
mapping.register('network', 'univentionNetworkLink', None, univention.admin.mapping.ListToString)
326
mapping.register('network', 'univentionNetworkLink', None, univention.admin.mapping.ListToString)
338
mapping.register('unixhome', 'homeDirectory', None, univention.admin.mapping.ListToString)
327
mapping.register('unixhome', 'homeDirectory', None, univention.admin.mapping.ListToString)
339
mapping.register('shell', 'loginShell', None, univention.admin.mapping.ListToString)
328
mapping.register('shell', 'loginShell', None, univention.admin.mapping.ListToString)
329
mapping.register('operatingSystem', 'univentionOperatingSystem', None, univention.admin.mapping.ListToString)
330
mapping.register('operatingSystemVersion', 'univentionOperatingSystemVersion', None, univention.admin.mapping.ListToString)
340
331
341
# add Nagios extension
332
# add Nagios extension
342
nagios.addPropertiesMappingOptionsAndLayout(property_descriptions, mapping, options, layout)
333
nagios.addPropertiesMappingOptionsAndLayout(property_descriptions, mapping, options, layout)
343
334
344
335
345
class object(univention.admin.handlers.simpleComputer, nagios.Support):
336
class object(computerBase):
346
	module=module
337
	module=module
338
	mapping = mapping
339
	CONFIG_NAME = 'univentionDefaultClientGroup'
340
	DEFAULT_OCS = ['top', 'person', 'univentionHost', 'univentionMacOSClient']
341
	SAMBA_ACCOUNT_FLAG = 'W'
342
	SERVER_TYPE = 'univentionMacOSClient'
343
del object.link
347
344
348
	def __init__(self, co, lo, position, dn='', superordinate=None, attributes = [] ):
345
rewrite = object.rewrite
349
		univention.admin.handlers.simpleComputer.__init__(self, co, lo, position, dn, superordinate, attributes)
346
identify = object.identify
350
		nagios.Support.__init__(self)
351
352
	def open(self):
353
		univention.admin.handlers.simpleComputer.open( self )
354
		self.nagios_open()
355
356
		self.modifypassword=0
357
		if self.exists():
358
			userPassword=self.oldattr.get('userPassword',[''])[0]
359
			if userPassword:
360
				self.info['password']=userPassword
361
				self.modifypassword=0
362
		if self.exists():
363
364
			if 'posix' in self.options and not self.info.get( 'primaryGroup' ):
365
				primaryGroupNumber=self.oldattr.get('gidNumber',[''])[0]
366
				univention.debug.debug(univention.debug.ADMIN, univention.debug.INFO, 'primary group number = %s' % (primaryGroupNumber))
367
				if primaryGroupNumber:
368
					primaryGroupResult=self.lo.searchDn(filter_format('(&(objectClass=posixGroup)(gidNumber=%s))', [primaryGroupNumber]))
369
					if primaryGroupResult:
370
						self['primaryGroup']=primaryGroupResult[0]
371
						univention.debug.debug(univention.debug.ADMIN, univention.debug.INFO, 'Set primary group = %s' % (self['primaryGroup']))
372
					else:
373
						self['primaryGroup']=None
374
						self.save()
375
						raise univention.admin.uexceptions.primaryGroup
376
				else:
377
					self['primaryGroup']=None
378
					self.save()
379
					raise univention.admin.uexceptions.primaryGroup
380
			if 'samba' in self.options:
381
				sid = self.oldattr.get('sambaSID', [''])[0]
382
				pos = sid.rfind('-')
383
				self.info['sambaRID'] = sid[pos+1:]
384
385
			self.save()
386
		else:
387
			self.modifypassword=0
388
			if 'posix' in self.options:
389
				res=univention.admin.config.getDefaultValue(self.lo, 'univentionDefaultClientGroup', position=self.position)
390
				if res:
391
					self['primaryGroup']=res
392
393
	def _ldap_pre_create(self):
394
		super(object, self)._ldap_pre_create()
395
		if not self['password']:
396
			self['password']=self.oldattr.get('password',[''])[0]
397
			self.modifypassword=0
398
399
	def _ldap_addlist(self):
400
		ocs=['top', 'person', 'univentionHost', 'univentionMacOSClient']
401
		al=[]
402
		if 'kerberos' in self.options:
403
			domain=univention.admin.uldap.domain(self.lo, self.position)
404
			realm=domain.getKerberosRealm()
405
406
			if realm:
407
				al.append(('krb5MaxLife', '86400'))
408
				al.append(('krb5MaxRenew', '604800'))
409
				al.append(('krb5KDCFlags', '126'))
410
				krb_key_version=str(int(self.oldattr.get('krb5KeyVersionNumber', ['0'])[0])+1)
411
				al.append(('krb5KeyVersionNumber', self.oldattr.get('krb5KeyVersionNumber', []), krb_key_version))
412
			else:
413
				# can't do kerberos
414
				self._remove_option( 'kerberos' )
415
		if 'posix' in self.options:
416
			self.uidNum=univention.admin.allocators.request(self.lo, self.position, 'uidNumber')
417
			self.alloc.append(('uidNumber',self.uidNum))
418
			gidNum = self.get_gid_for_primary_group()
419
			al.append(('uidNumber', [self.uidNum]))
420
			al.append(('gidNumber', [gidNum]))
421
422
		if self.modifypassword or self['password']:
423
			if 'kerberos' in self.options:
424
				krb_keys=univention.admin.password.krb5_asn1(self.krb5_principal(), self['password'])
425
				al.append(('krb5Key', self.oldattr.get('password', ['1']), krb_keys))
426
			if 'posix' in self.options:
427
				password_crypt = "{crypt}%s" % (univention.admin.password.crypt(self['password']))
428
				al.append(('userPassword', self.oldattr.get('userPassword', [''])[0], password_crypt))
429
			if 'samba' in self.options:
430
				password_nt, password_lm = univention.admin.password.ntlm(self['password'])
431
				al.append(('sambaNTPassword', self.oldattr.get('sambaNTPassword', [''])[0], password_nt))
432
				al.append(('sambaLMPassword', self.oldattr.get('sambaLMPassword', [''])[0], password_lm))
433
				sambaPwdLastSetValue = str(long(time.time()))
434
				al.append(('sambaPwdLastSet', self.oldattr.get('sambaPwdLastSet', [''])[0], sambaPwdLastSetValue))
435
			self.modifypassword=0
436
		if 'samba' in self.options:
437
			acctFlags=univention.admin.samba.acctFlags(flags={'W':1})
438
			if self.s4connector_present:
439
				# In this case Samba 4 must create the SID, the s4 connector will sync the
440
				# new sambaSID back from Samba 4.
441
				self.machineSid='S-1-4-%s' % self.uidNum
442
			else:
443
				self.machineSid = self.getMachineSid(self.lo, self.position, self.uidNum, self.get('sambaRID'))
444
				self.alloc.append(('sid',self.machineSid))
445
			al.append(('sambaSID', [self.machineSid]))
446
			al.append(('sambaAcctFlags', [acctFlags.decode()]))
447
			al.append(('displayName', self.info['name']))
448
449
		al.insert(0, ('objectClass', ocs))
450
451
		return al
452
453
	def _ldap_post_create(self):
454
		if 'posix' in self.options:
455
			if hasattr(self, 'uid') and self.uid:
456
				univention.admin.allocators.confirm(self.lo, self.position, 'uid', self.uid)
457
			univention.admin.handlers.simpleComputer.primary_group( self )
458
			univention.admin.handlers.simpleComputer.update_groups( self )
459
		univention.admin.handlers.simpleComputer._ldap_post_create( self )
460
		self.nagios_ldap_post_create()
461
462
	def _ldap_pre_remove(self):
463
		self.open()
464
		if 'posix' in self.options and self.oldattr.get( 'uidNumber' ):
465
			self.uidNum=self.oldattr['uidNumber'][0]
466
467
	def _ldap_post_remove(self):
468
		if 'posix' in self.options:
469
			univention.admin.allocators.release(self.lo, self.position, 'uidNumber', self.uidNum)
470
		groupObjects=univention.admin.handlers.groups.group.lookup(self.co, self.lo, filter_s=filter_format('uniqueMember', [self.dn]))
471
		if groupObjects:
472
			for i in range(0, len(groupObjects)):
473
				groupObjects[i].open()
474
				if self.dn in groupObjects[i]['users']:
475
					groupObjects[i]['users'].remove(self.dn)
476
					groupObjects[i].modify(ignore_license=1)
477
478
		self.nagios_ldap_post_remove()
479
		univention.admin.handlers.simpleComputer._ldap_post_remove( self )
480
		# Need to clean up oldinfo. If remove was invoked, because the
481
		# creation of the object has failed, the next try will result in
482
		# a 'object class violation' (Bug #19343)
483
		self.oldinfo = {}
484
485
	def krb5_principal(self):
486
		domain=univention.admin.uldap.domain(self.lo, self.position)
487
		realm=domain.getKerberosRealm()
488
		if self.info.has_key('domain') and self.info['domain']:
489
			kerberos_domain=self.info['domain']
490
		else:
491
			kerberos_domain=domain.getKerberosRealm()
492
		return 'host/' + self['name']+'.'+kerberos_domain.lower()+'@'+realm
493
494
	def _ldap_post_modify(self):
495
		univention.admin.handlers.simpleComputer.primary_group( self )
496
		univention.admin.handlers.simpleComputer.update_groups( self )
497
		univention.admin.handlers.simpleComputer._ldap_post_modify( self )
498
		self.nagios_ldap_post_modify()
499
500
	def _ldap_pre_modify(self):
501
		if self.hasChanged('password'):
502
			if not self['password']:
503
				self['password']=self.oldattr.get('password',[''])[0]
504
				self.modifypassword=0
505
			elif not self.info['password']:
506
				self['password']=self.oldattr.get('password',[''])[0]
507
				self.modifypassword=0
508
			else:
509
				self.modifypassword=1
510
		self.nagios_ldap_pre_modify()
511
		univention.admin.handlers.simpleComputer._ldap_pre_modify( self )
512
513
514
	def _ldap_modlist(self):
515
		ml=univention.admin.handlers.simpleComputer._ldap_modlist( self )
516
517
		self.nagios_ldap_modlist(ml)
518
519
		if self.hasChanged('name'):
520
			if 'posix' in self.options:
521
				if hasattr(self, 'uidNum'):
522
					univention.admin.allocators.confirm(self.lo, self.position, 'uidNumber', self.uidNum)
523
				requested_uid="%s$" % self['name']
524
				try:
525
					self.uid=univention.admin.allocators.request(self.lo, self.position, 'uid', value=requested_uid)
526
				except Exception:
527
					self.cancel()
528
					raise univention.admin.uexceptions.uidAlreadyUsed, ': %s' % requested_uid
529
					return []
530
531
				self.alloc.append(('uid',self.uid))
532
533
				ml.append(('uid', self.oldattr.get('uid', [None])[0], self.uid))
534
535
			if 'samba' in self.options:
536
				ml.append(('displayName', self.oldattr.get('displayName', [None])[0], self['name']))
537
538
			if 'kerberos' in self.options:
539
				ml.append(('krb5PrincipalName', self.oldattr.get('krb5PrincipalName', []), [self.krb5_principal()]))
540
541
		if self.modifypassword and self['password']:
542
			if 'kerberos' in self.options:
543
				krb_keys=univention.admin.password.krb5_asn1(self.krb5_principal(), self['password'])
544
				krb_key_version=str(int(self.oldattr.get('krb5KeyVersionNumber', ['0'])[0])+1)
545
				ml.append(('krb5Key', self.oldattr.get('password', ['1']), krb_keys))
546
				ml.append(('krb5KeyVersionNumber', self.oldattr.get('krb5KeyVersionNumber', []), krb_key_version))
547
			if 'posix' in self.options:
548
				password_crypt = "{crypt}%s" % (univention.admin.password.crypt(self['password']))
549
				ml.append(('userPassword', self.oldattr.get('userPassword', [''])[0], password_crypt))
550
			if 'samba' in self.options:
551
				password_nt, password_lm = univention.admin.password.ntlm(self['password'])
552
				ml.append(('sambaNTPassword', self.oldattr.get('sambaNTPassword', [''])[0], password_nt))
553
				ml.append(('sambaLMPassword', self.oldattr.get('sambaLMPassword', [''])[0], password_lm))
554
				sambaPwdLastSetValue = str(long(time.time()))
555
				ml.append(('sambaPwdLastSet', self.oldattr.get('sambaPwdLastSet', [''])[0], sambaPwdLastSetValue))
556
557
		# add samba option
558
		if self.exists() and self.option_toggled('samba') and 'samba' in self.options:
559
			acctFlags=univention.admin.samba.acctFlags(flags={'W':1})
560
			if self.s4connector_present:
561
				# In this case Samba 4 must create the SID, the s4 connector will sync the
562
				# new sambaSID back from Samba 4.
563
				self.machineSid='S-1-4-%s' % self.oldattr['uidNumber'][0]
564
			else:
565
				self.machineSid = self.getMachineSid(self.lo, self.position, self.oldattr['uidNumber'][0], self.get('sambaRID'))
566
				self.alloc.append(('sid',self.machineSid))
567
			ml.append(('sambaSID', '', [self.machineSid]))
568
			ml.append(('sambaAcctFlags', '', [acctFlags.decode()]))
569
			ml.append(('displayName', '', self.info['name']))
570
			sambaPwdLastSetValue = str(long(time.time()))
571
			ml.append(('sambaPwdLastSet', self.oldattr.get('sambaPwdLastSet', [''])[0], sambaPwdLastSetValue))
572
		if self.exists() and self.option_toggled('samba') and 'samba' not in self.options:
573
			for key in [ 'sambaSID', 'sambaAcctFlags', 'sambaNTPassword', 'sambaLMPassword', 'sambaPwdLastSet', 'displayName' ]:
574
				if self.oldattr.get(key, []):
575
					ml.insert(0, (key, self.oldattr.get(key, []), ''))
576
577
		if self.hasChanged('sambaRID') and not hasattr(self, 'machineSid'):
578
			self.machineSid = self.getMachineSid(self.lo, self.position, self.oldattr['uidNumber'][0], self.get('sambaRID'))
579
			ml.append(('sambaSID', self.oldattr.get('sambaSID', ['']), [self.machineSid]))
580
581
		return ml
582
583
	def cleanup(self):
584
		self.open()
585
		self.nagios_cleanup()
586
		univention.admin.handlers.simpleComputer.cleanup( self )
587
588
	def cancel(self):
589
		for i,j in self.alloc:
590
			univention.debug.debug(univention.debug.ADMIN, univention.debug.WARN, 'cancel: release (%s): %s' % (i,j) )
591
			univention.admin.allocators.release(self.lo, self.position, i, j)
592
593
def rewrite(filter, mapping):
594
	if filter.variable == 'ip':
595
		filter.variable='aRecord'
596
	else:
597
		univention.admin.mapping.mapRewrite(filter, mapping)
598
347
599
def lookup(co, lo, filter_s, base='', superordinate=None, scope='sub', unique=0, required=0, timeout=-1, sizelimit=0):
348
def lookup(co, lo, filter_s, base='', superordinate=None, scope='sub', unique=0, required=0, timeout=-1, sizelimit=0):
600
349
 Lines 618-625   def lookup(co, lo, filter_s, base='', superordinate=None, scope='sub', unique=0, Link Here 
618
		for dn, attrs in lo.search(unicode(filter), base, scope, [], unique, required, timeout, sizelimit):
367
		for dn, attrs in lo.search(unicode(filter), base, scope, [], unique, required, timeout, sizelimit):
619
			res.append( object( co, lo, None, dn, attributes = attrs ) )
368
			res.append( object( co, lo, None, dn, attributes = attrs ) )
620
	return res
369
	return res
621
622
def identify(dn, attr, canonical=0):
623
		
624
	return 'univentionHost' in attr.get('objectClass', []) and 'univentionMacOSClient' in attr.get('objectClass', [])
625
(-)a/management/univention-directory-manager-modules/modules/univention/admin/handlers/computers/memberserver.py (-310 / +14 lines)
 Lines 30-50    Link Here 
30
# /usr/share/common-licenses/AGPL-3; if not, see
30
# /usr/share/common-licenses/AGPL-3; if not, see
31
# <http://www.gnu.org/licenses/>.
31
# <http://www.gnu.org/licenses/>.
32
32
33
from ldap.filter import filter_format
34
35
from univention.admin.layout import Tab, Group
33
from univention.admin.layout import Tab, Group
36
import univention.admin.filter
34
import univention.admin.filter
37
import univention.admin.handlers
35
import univention.admin.handlers
38
import univention.admin.password
39
import univention.admin.allocators
40
import univention.admin.localization
36
import univention.admin.localization
41
import univention.admin.uldap
42
import univention.admin.nagios as nagios
37
import univention.admin.nagios as nagios
43
import univention.admin.handlers.dns.forward_zone
38
from univention.admin.handlers.computers.base import computerBase
44
import univention.admin.handlers.dns.reverse_zone
45
import univention.admin.handlers.groups.group
46
import univention.admin.handlers.networks.network
47
import time
48
39
49
translation=univention.admin.localization.translation('univention.admin.handlers.computers')
40
translation=univention.admin.localization.translation('univention.admin.handlers.computers')
50
_=translation.translate
41
_=translation.translate
 Lines 386-394    Link Here 
386
mapping.register('name', 'cn', None, univention.admin.mapping.ListToString)
377
mapping.register('name', 'cn', None, univention.admin.mapping.ListToString)
387
mapping.register('description', 'description', None, univention.admin.mapping.ListToString)
378
mapping.register('description', 'description', None, univention.admin.mapping.ListToString)
388
mapping.register('domain', 'associatedDomain', None, univention.admin.mapping.ListToString)
379
mapping.register('domain', 'associatedDomain', None, univention.admin.mapping.ListToString)
389
mapping.register('inventoryNumber', 'univentionInventoryNumber')
390
mapping.register('serverRole', 'univentionServerRole')
380
mapping.register('serverRole', 'univentionServerRole')
391
mapping.register('mac', 'macAddress' )
381
mapping.register('mac', 'macAddress' )
382
mapping.register('inventoryNumber', 'univentionInventoryNumber')
392
mapping.register('reinstall', 'univentionServerReinstall', None, univention.admin.mapping.ListToString)
383
mapping.register('reinstall', 'univentionServerReinstall', None, univention.admin.mapping.ListToString)
393
mapping.register('instprofile', 'univentionServerInstallationProfile', None, univention.admin.mapping.ListToString)
384
mapping.register('instprofile', 'univentionServerInstallationProfile', None, univention.admin.mapping.ListToString)
394
mapping.register('reinstalloption', 'univentionServerInstallationOption', None, univention.admin.mapping.ListToString)
385
mapping.register('reinstalloption', 'univentionServerInstallationOption', None, univention.admin.mapping.ListToString)
 Lines 403-705    Link Here 
403
nagios.addPropertiesMappingOptionsAndLayout(property_descriptions, mapping, options, layout)
394
nagios.addPropertiesMappingOptionsAndLayout(property_descriptions, mapping, options, layout)
404
395
405
396
406
class object(univention.admin.handlers.simpleComputer, nagios.Support):
397
class object(computerBase):
407
	module=module
398
	module=module
408
399
	mapping = mapping
409
	def __init__(self, co, lo, position, dn='', superordinate=None, attributes = [] ):
400
	CONFIG_NAME = 'univentionDefaultMemberserverGroup'
410
		univention.admin.handlers.simpleComputer.__init__(self, co, lo, position, dn, superordinate, attributes)
401
	DEFAULT_OCS = ['top', 'person', 'univentionHost', 'univentionMemberServer']
411
		nagios.Support.__init__(self)
402
	SAMBA_ACCOUNT_FLAG = 'W'
412
403
	SERVER_TYPE = 'univentionMemberServer'
413
	def open(self):
404
	SERVER_ROLE = 'member'
414
		univention.admin.handlers.simpleComputer.open( self )
405
415
		self.nagios_open()
406
rewrite = object.rewrite
416
407
lookup_filter = object.lookup_filter
417
		self.modifypassword=0
408
lookup = object.lookup
418
		if self.exists():
409
identify = object.identify
419
			userPassword=self.oldattr.get('userPassword',[''])[0]
420
			if userPassword:
421
				self.info['password']=userPassword
422
				self.modifypassword=0
423
		if self.exists():
424
425
			if 'posix' in self.options and not self.info.get( 'primaryGroup' ):
426
				primaryGroupNumber=self.oldattr.get('gidNumber',[''])[0]
427
				univention.debug.debug(univention.debug.ADMIN, univention.debug.INFO, 'primary group number = %s' % (primaryGroupNumber))
428
				if primaryGroupNumber:
429
					primaryGroupResult=self.lo.searchDn(filter_format('(&(objectClass=posixGroup)(gidNumber=%s))', [primaryGroupNumber]))
430
					if primaryGroupResult:
431
						self['primaryGroup']=primaryGroupResult[0]
432
						univention.debug.debug(univention.debug.ADMIN, univention.debug.INFO, 'Set primary group = %s' % (self['primaryGroup']))
433
					else:
434
						self['primaryGroup']=None
435
						self.save()
436
						raise univention.admin.uexceptions.primaryGroup
437
				else:
438
					self['primaryGroup']=None
439
					self.save()
440
					raise univention.admin.uexceptions.primaryGroup
441
			if 'samba' in self.options:
442
				sid = self.oldattr.get('sambaSID', [''])[0]
443
				pos = sid.rfind('-')
444
				self.info['sambaRID'] = sid[pos+1:]
445
446
			self.save()
447
		else:
448
			self.modifypassword=0
449
			if 'posix' in self.options:
450
				res=univention.admin.config.getDefaultValue(self.lo, 'univentionDefaultMemberserverGroup', position=self.position)
451
				if res:
452
					self['primaryGroup']=res
453
454
	def _ldap_pre_create(self):
455
		super(object, self)._ldap_pre_create()
456
		if not self['password']:
457
			self['password']=self.oldattr.get('password',[''])[0]
458
			self.modifypassword=0
459
460
	def _ldap_addlist(self):
461
		ocs=['top', 'person', 'univentionHost', 'univentionMemberServer']
462
		al=[]
463
		if 'kerberos' in self.options:
464
			domain=univention.admin.uldap.domain(self.lo, self.position)
465
			realm=domain.getKerberosRealm()
466
467
			if realm:
468
				al.append(('krb5MaxLife', '86400'))
469
				al.append(('krb5MaxRenew', '604800'))
470
				al.append(('krb5KDCFlags', '126'))
471
				krb_key_version=str(int(self.oldattr.get('krb5KeyVersionNumber', ['0'])[0])+1)
472
				al.append(('krb5KeyVersionNumber', self.oldattr.get('krb5KeyVersionNumber', []), krb_key_version))
473
			else:
474
				# can't do kerberos
475
				self._remove_option( 'kerberos' )
476
		if 'posix' in self.options:
477
			self.uidNum=univention.admin.allocators.request(self.lo, self.position, 'uidNumber')
478
			self.alloc.append(('uidNumber',self.uidNum))
479
			gidNum = self.get_gid_for_primary_group()
480
			al.append(('uidNumber', [self.uidNum]))
481
			al.append(('gidNumber', [gidNum]))
482
483
		if self.modifypassword or self['password']:
484
			if 'kerberos' in self.options:
485
				krb_keys=univention.admin.password.krb5_asn1(self.krb5_principal(), self['password'])
486
				al.append(('krb5Key', self.oldattr.get('password', ['1']), krb_keys))
487
			if 'posix' in self.options:
488
				password_crypt = "{crypt}%s" % (univention.admin.password.crypt(self['password']))
489
				al.append(('userPassword', self.oldattr.get('userPassword', [''])[0], password_crypt))
490
			if 'samba' in self.options:
491
				password_nt, password_lm = univention.admin.password.ntlm(self['password'])
492
				al.append(('sambaNTPassword', self.oldattr.get('sambaNTPassword', [''])[0], password_nt))
493
				al.append(('sambaLMPassword', self.oldattr.get('sambaLMPassword', [''])[0], password_lm))
494
				sambaPwdLastSetValue = str(long(time.time()))
495
				al.append(('sambaPwdLastSet', self.oldattr.get('sambaPwdLastSet', [''])[0], sambaPwdLastSetValue))
496
			self.modifypassword=0
497
		if 'samba' in self.options:
498
			acctFlags=univention.admin.samba.acctFlags(flags={'W':1})
499
			if self.s4connector_present:
500
				# In this case Samba 4 must create the SID, the s4 connector will sync the
501
				# new sambaSID back from Samba 4.
502
				self.machineSid='S-1-4-%s' % self.uidNum
503
			else:
504
				self.machineSid = self.getMachineSid(self.lo, self.position, self.uidNum, self.get('sambaRID'))
505
				self.alloc.append(('sid',self.machineSid))
506
			al.append(('sambaSID', [self.machineSid]))
507
			al.append(('sambaAcctFlags', [acctFlags.decode()]))
508
			al.append(('displayName', self.info['name']))
509
510
		al.insert(0, ('objectClass', ocs))
511
		al.append(('univentionServerRole', '', 'member'))
512
		return al
513
514
	def _ldap_post_create(self):
515
		if 'posix' in self.options:
516
			if hasattr(self, 'uid') and self.uid:
517
				univention.admin.allocators.confirm(self.lo, self.position, 'uid', self.uid)
518
			univention.admin.handlers.simpleComputer.primary_group( self )
519
			univention.admin.handlers.simpleComputer.update_groups( self )
520
		univention.admin.handlers.simpleComputer._ldap_post_create( self )
521
		self.nagios_ldap_post_create()
522
523
	def _ldap_pre_remove(self):
524
		self.open()
525
		if 'posix' in self.options and self.oldattr.get( 'uidNumber' ):
526
			self.uidNum=self.oldattr['uidNumber'][0]
527
528
	def _ldap_post_remove(self):
529
		if 'posix' in self.options:
530
			univention.admin.allocators.release(self.lo, self.position, 'uidNumber', self.uidNum)
531
		groupObjects=univention.admin.handlers.groups.group.lookup(self.co, self.lo, filter_s=filter_format('uniqueMember', [self.dn]))
532
		if groupObjects:
533
			for i in range(0, len(groupObjects)):
534
				groupObjects[i].open()
535
				if self.dn in groupObjects[i]['users']:
536
					groupObjects[i]['users'].remove(self.dn)
537
					groupObjects[i].modify(ignore_license=1)
538
539
		self.nagios_ldap_post_remove()
540
		univention.admin.handlers.simpleComputer._ldap_post_remove( self )
541
		# Need to clean up oldinfo. If remove was invoked, because the
542
		# creation of the object has failed, the next try will result in
543
		# a 'object class violation' (Bug #19343)
544
		self.oldinfo = {}
545
546
	def krb5_principal(self):
547
		domain=univention.admin.uldap.domain(self.lo, self.position)
548
		realm=domain.getKerberosRealm()
549
		if self.info.has_key('domain') and self.info['domain']:
550
			kerberos_domain=self.info['domain']
551
		else:
552
			kerberos_domain=domain.getKerberosRealm()
553
		return 'host/' + self['name']+'.'+kerberos_domain.lower()+'@'+realm
554
555
	def _ldap_post_modify(self):
556
		univention.admin.handlers.simpleComputer.primary_group( self )
557
		univention.admin.handlers.simpleComputer.update_groups( self )
558
		univention.admin.handlers.simpleComputer._ldap_post_modify( self )
559
		self.nagios_ldap_post_modify()
560
561
	def _ldap_pre_modify(self):
562
		if self.hasChanged('password'):
563
			if not self['password']:
564
				self['password']=self.oldattr.get('password',[''])[0]
565
				self.modifypassword=0
566
			elif not self.info['password']:
567
				self['password']=self.oldattr.get('password',[''])[0]
568
				self.modifypassword=0
569
			else:
570
				self.modifypassword=1
571
		self.nagios_ldap_pre_modify()
572
		univention.admin.handlers.simpleComputer._ldap_pre_modify( self )
573
574
575
	def _ldap_modlist(self):
576
		ml=univention.admin.handlers.simpleComputer._ldap_modlist( self )
577
578
		self.nagios_ldap_modlist(ml)
579
580
		if self.hasChanged('name'):
581
			if 'posix' in self.options:
582
				if hasattr(self, 'uidNum'):
583
					univention.admin.allocators.confirm(self.lo, self.position, 'uidNumber', self.uidNum)
584
				requested_uid="%s$" % self['name']
585
				try:
586
					self.uid=univention.admin.allocators.request(self.lo, self.position, 'uid', value=requested_uid)
587
				except Exception:
588
					self.cancel()
589
					raise univention.admin.uexceptions.uidAlreadyUsed, ': %s' % requested_uid
590
					return []
591
592
				self.alloc.append(('uid',self.uid))
593
594
				ml.append(('uid', self.oldattr.get('uid', [None])[0], self.uid))
595
596
			if 'samba' in self.options:
597
				ml.append(('displayName', self.oldattr.get('displayName', [None])[0], self['name']))
598
599
			if 'kerberos' in self.options:
600
				ml.append(('krb5PrincipalName', self.oldattr.get('krb5PrincipalName', []), [self.krb5_principal()]))
601
602
		if self.modifypassword and self['password']:
603
			if 'kerberos' in self.options:
604
				krb_keys=univention.admin.password.krb5_asn1(self.krb5_principal(), self['password'])
605
				krb_key_version=str(int(self.oldattr.get('krb5KeyVersionNumber', ['0'])[0])+1)
606
				ml.append(('krb5Key', self.oldattr.get('password', ['1']), krb_keys))
607
				ml.append(('krb5KeyVersionNumber', self.oldattr.get('krb5KeyVersionNumber', []), krb_key_version))
608
			if 'posix' in self.options:
609
				password_crypt = "{crypt}%s" % (univention.admin.password.crypt(self['password']))
610
				ml.append(('userPassword', self.oldattr.get('userPassword', [''])[0], password_crypt))
611
			if 'samba' in self.options:
612
				password_nt, password_lm = univention.admin.password.ntlm(self['password'])
613
				ml.append(('sambaNTPassword', self.oldattr.get('sambaNTPassword', [''])[0], password_nt))
614
				ml.append(('sambaLMPassword', self.oldattr.get('sambaLMPassword', [''])[0], password_lm))
615
				sambaPwdLastSetValue = str(long(time.time()))
616
				ml.append(('sambaPwdLastSet', self.oldattr.get('sambaPwdLastSet', [''])[0], sambaPwdLastSetValue))
617
618
		# add samba option
619
		if self.exists() and self.option_toggled('samba') and 'samba' in self.options:
620
			acctFlags=univention.admin.samba.acctFlags(flags={'W':1})
621
			if self.s4connector_present:
622
				# In this case Samba 4 must create the SID, the s4 connector will sync the
623
				# new sambaSID back from Samba 4.
624
				self.machineSid='S-1-4-%s' % self.oldattr['uidNumber'][0]
625
			else:
626
				self.machineSid = self.getMachineSid(self.lo, self.position, self.oldattr['uidNumber'][0], self.get('sambaRID'))
627
				self.alloc.append(('sid',self.machineSid))
628
			ml.append(('sambaSID', '', [self.machineSid]))
629
			ml.append(('sambaAcctFlags', '', [acctFlags.decode()]))
630
			ml.append(('displayName', '', self.info['name']))
631
			sambaPwdLastSetValue = str(long(time.time()))
632
			ml.append(('sambaPwdLastSet', self.oldattr.get('sambaPwdLastSet', [''])[0], sambaPwdLastSetValue))
633
		if self.exists() and self.option_toggled('samba') and 'samba' not in self.options:
634
			for key in [ 'sambaSID', 'sambaAcctFlags', 'sambaNTPassword', 'sambaLMPassword', 'sambaPwdLastSet', 'displayName' ]:
635
				if self.oldattr.get(key, []):
636
					ml.insert(0, (key, self.oldattr.get(key, []), ''))
637
638
		if self.hasChanged('sambaRID') and not hasattr(self, 'machineSid'):
639
			self.machineSid = self.getMachineSid(self.lo, self.position, self.oldattr['uidNumber'][0], self.get('sambaRID'))
640
			ml.append(('sambaSID', self.oldattr.get('sambaSID', ['']), [self.machineSid]))
641
642
		return ml
643
644
	def cleanup(self):
645
		self.open()
646
		self.nagios_cleanup()
647
		univention.admin.handlers.simpleComputer.cleanup( self )
648
649
	def cancel(self):
650
		for i,j in self.alloc:
651
			univention.debug.debug(univention.debug.ADMIN, univention.debug.WARN, 'cancel: release (%s): %s' % (i,j) )
652
			univention.admin.allocators.release(self.lo, self.position, i, j)
653
654
	def link(self):
655
		result = []
656
		if self['ip'] and len( self[ 'ip' ] ) > 0 and self['ip'][ 0 ]:
657
			result = [{ 'url': 'https://%s/univention-management-console/' % self['ip'][ 0 ],
658
						'ipaddr': self['ip'][ 0 ],
659
						}]
660
		if self.has_key('dnsEntryZoneForward') and self['dnsEntryZoneForward'] and len( self['dnsEntryZoneForward' ] ) > 0:
661
			zone = univention.admin.uldap.explodeDn( self['dnsEntryZoneForward'][0], 1)[0]
662
			if not result:
663
				result = [ { 'url': 'https://%s.%s/univention-management-console/' % (self['name'], zone) }]
664
			result[0]['fqdn'] = '%s.%s' % (self['name'], zone)
665
		if result:
666
			result[0]['name'] = _('Open Univention Management Console on this computer')
667
			return result
668
		return None
669
670
def rewrite(filter, mapping):
671
	if filter.variable == 'ip':
672
		filter.variable='aRecord'
673
	else:
674
		univention.admin.mapping.mapRewrite(filter, mapping)
675
676
def lookup_filter(filter_s=None, lo=None):
677
	filter_s = univention.admin.filter.replace_fqdn_filter( filter_s )
678
	if str(filter_s).find('(dnsAlias=') != -1:
679
		filter_s = univention.admin.handlers.dns.alias.lookup_alias_filter(lo, filter_s)
680
		if filter_s:
681
			return lookup_filter(filter_s, lo)
682
		else:
683
			return None
684
	lookup_filter_obj = \
685
		univention.admin.filter.conjunction('&', [
686
			univention.admin.filter.expression('objectClass', 'univentionHost'),
687
			univention.admin.filter.expression('objectClass', 'univentionMemberServer'),
688
		])
689
690
	# ATTENTION: has its own rewrite function.
691
	lookup_filter_obj.append_unmapped_filter_string(filter_s, rewrite, mapping)
692
	return lookup_filter_obj
693
694
def lookup(co, lo, filter_s, base='', superordinate=None, scope='sub', unique=0, required=0, timeout=-1, sizelimit=0):
695
696
	filter=lookup_filter(filter_s, lo)
697
	if filter is None:
698
		return []
699
	res=[]
700
	for dn, attrs in lo.search(unicode(filter), base, scope, [], unique, required, timeout, sizelimit):
701
		res.append( object( co, lo, None, dn, attributes = attrs ) )
702
	return res
703
704
def identify(dn, attr, canonical=0):
705
	return 'univentionHost' in attr.get('objectClass', []) and 'univentionMemberServer' in attr.get('objectClass', [])
(-)a/management/univention-directory-manager-modules/modules/univention/admin/handlers/computers/ubuntu.py (-262 / +10 lines)
 Lines 30-50    Link Here 
30
# /usr/share/common-licenses/AGPL-3; if not, see
30
# /usr/share/common-licenses/AGPL-3; if not, see
31
# <http://www.gnu.org/licenses/>.
31
# <http://www.gnu.org/licenses/>.
32
32
33
from ldap.filter import filter_format
34
35
from univention.admin.layout import Tab, Group
33
from univention.admin.layout import Tab, Group
36
import univention.admin.filter
34
import univention.admin.filter
37
import univention.admin.handlers
35
import univention.admin.handlers
38
import univention.admin.password
39
import univention.admin.allocators
40
import univention.admin.localization
36
import univention.admin.localization
41
import univention.admin.uldap
42
import univention.admin.nagios as nagios
37
import univention.admin.nagios as nagios
43
import univention.admin.handlers.dns.forward_zone
38
from univention.admin.handlers.computers.base import computerBase
44
import univention.admin.handlers.dns.reverse_zone
45
import univention.admin.handlers.groups.group
46
import univention.admin.handlers.networks.network
47
import time
48
39
49
translation=univention.admin.localization.translation('univention.admin.handlers.computers')
40
translation=univention.admin.localization.translation('univention.admin.handlers.computers')
50
_=translation.translate
41
_=translation.translate
 Lines 341-603    Link Here 
341
nagios.addPropertiesMappingOptionsAndLayout(property_descriptions, mapping, options, layout)
332
nagios.addPropertiesMappingOptionsAndLayout(property_descriptions, mapping, options, layout)
342
333
343
334
344
class object(univention.admin.handlers.simpleComputer, nagios.Support):
335
class object(computerBase):
345
	module=module
336
	module=module
337
	mapping = mapping
338
	CONFIG_NAME = 'univentionDefaultClientGroup'
339
	DEFAULT_OCS = ['top', 'person', 'univentionHost', 'univentionUbuntuClient']
340
	SAMBA_ACCOUNT_FLAG = 'W'
341
	SERVER_TYPE = 'univentionUbuntuClient'
346
342
347
	def __init__(self, co, lo, position, dn='', superordinate=None, attributes = [] ):
343
	def check_required_options(self):
348
		univention.admin.handlers.simpleComputer.__init__(self, co, lo, position, dn, superordinate, attributes)
349
		nagios.Support.__init__(self)
350
351
	def open(self):
352
		univention.admin.handlers.simpleComputer.open( self )
353
		self.nagios_open()
354
355
		self.modifypassword=0
356
		if self.exists():
357
			userPassword=self.oldattr.get('userPassword',[''])[0]
358
			if userPassword:
359
				self.info['password']=userPassword
360
				self.modifypassword=0
361
		if self.exists():
362
363
			if 'posix' in self.options and not self.info.get( 'primaryGroup' ):
364
				primaryGroupNumber=self.oldattr.get('gidNumber',[''])[0]
365
				univention.debug.debug(univention.debug.ADMIN, univention.debug.INFO, 'primary group number = %s' % (primaryGroupNumber))
366
				if primaryGroupNumber:
367
					primaryGroupResult=self.lo.searchDn(filter_format('(&(objectClass=posixGroup)(gidNumber=%s))', [primaryGroupNumber]))
368
					if primaryGroupResult:
369
						self['primaryGroup']=primaryGroupResult[0]
370
						univention.debug.debug(univention.debug.ADMIN, univention.debug.INFO, 'Set primary group = %s' % (self['primaryGroup']))
371
					else:
372
						self['primaryGroup']=None
373
						self.save()
374
						raise univention.admin.uexceptions.primaryGroup
375
				else:
376
					self['primaryGroup']=None
377
					self.save()
378
					raise univention.admin.uexceptions.primaryGroup
379
			if 'samba' in self.options:
380
				sid = self.oldattr.get('sambaSID', [''])[0]
381
				pos = sid.rfind('-')
382
				self.info['sambaRID'] = sid[pos+1:]
383
384
			self.save()
385
		else:
386
			self.modifypassword=0
387
			if 'posix' in self.options:
388
				res=univention.admin.config.getDefaultValue(self.lo, 'univentionDefaultClientGroup', position=self.position)
389
				if res:
390
					self['primaryGroup']=res
391
392
	def _ldap_pre_create(self):
393
		super(object, self)._ldap_pre_create()
394
		if not self['password']:
395
			self['password']=self.oldattr.get('password',[''])[0]
396
			self.modifypassword=0
397
398
	def _ldap_addlist(self):
399
		if not set(self.options) & set(['posix', 'kerberos']):
344
		if not set(self.options) & set(['posix', 'kerberos']):
400
			raise univention.admin.uexceptions.invalidOptions(_(' At least posix or kerberos is required.'))
345
			raise univention.admin.uexceptions.invalidOptions(_(' At least posix or kerberos is required.'))
401
		
346
del object.link
402
		ocs=['top', 'person', 'univentionHost', 'univentionUbuntuClient']
403
		al=[]
404
		if 'kerberos' in self.options:
405
			domain=univention.admin.uldap.domain(self.lo, self.position)
406
			realm=domain.getKerberosRealm()
407
408
			if realm:
409
				al.append(('krb5MaxLife', '86400'))
410
				al.append(('krb5MaxRenew', '604800'))
411
				al.append(('krb5KDCFlags', '126'))
412
				krb_key_version=str(int(self.oldattr.get('krb5KeyVersionNumber', ['0'])[0])+1)
413
				al.append(('krb5KeyVersionNumber', self.oldattr.get('krb5KeyVersionNumber', []), krb_key_version))
414
			else:
415
				# can't do kerberos
416
				self._remove_option( 'kerberos' )
417
		if 'posix' in self.options:
418
			self.uidNum=univention.admin.allocators.request(self.lo, self.position, 'uidNumber')
419
			self.alloc.append(('uidNumber',self.uidNum))
420
			gidNum = self.get_gid_for_primary_group()
421
			al.append(('uidNumber', [self.uidNum]))
422
			al.append(('gidNumber', [gidNum]))
423
424
		if self.modifypassword or self['password']:
425
			if 'kerberos' in self.options:
426
				krb_keys=univention.admin.password.krb5_asn1(self.krb5_principal(), self['password'])
427
				al.append(('krb5Key', self.oldattr.get('password', ['1']), krb_keys))
428
			if 'posix' in self.options:
429
				password_crypt = "{crypt}%s" % (univention.admin.password.crypt(self['password']))
430
				al.append(('userPassword', self.oldattr.get('userPassword', [''])[0], password_crypt))
431
			if 'samba' in self.options:
432
				password_nt, password_lm = univention.admin.password.ntlm(self['password'])
433
				al.append(('sambaNTPassword', self.oldattr.get('sambaNTPassword', [''])[0], password_nt))
434
				al.append(('sambaLMPassword', self.oldattr.get('sambaLMPassword', [''])[0], password_lm))
435
				sambaPwdLastSetValue = str(long(time.time()))
436
				al.append(('sambaPwdLastSet', self.oldattr.get('sambaPwdLastSet', [''])[0], sambaPwdLastSetValue))
437
			self.modifypassword=0
438
		if 'samba' in self.options:
439
			acctFlags=univention.admin.samba.acctFlags(flags={'W':1})
440
			if self.s4connector_present:
441
				# In this case Samba 4 must create the SID, the s4 connector will sync the
442
				# new sambaSID back from Samba 4.
443
				self.machineSid='S-1-4-%s' % self.uidNum
444
			else:
445
				self.machineSid = self.getMachineSid(self.lo, self.position, self.uidNum, self.get('sambaRID'))
446
				self.alloc.append(('sid',self.machineSid))
447
			al.append(('sambaSID', [self.machineSid]))
448
			al.append(('sambaAcctFlags', [acctFlags.decode()]))
449
			al.append(('displayName', self.info['name']))
450
451
		al.insert(0, ('objectClass', ocs))
452
453
		return al
454
455
	def _ldap_post_create(self):
456
		if 'posix' in self.options:
457
			if hasattr(self, 'uid') and self.uid:
458
				univention.admin.allocators.confirm(self.lo, self.position, 'uid', self.uid)
459
			univention.admin.handlers.simpleComputer.primary_group( self )
460
			univention.admin.handlers.simpleComputer.update_groups( self )
461
		univention.admin.handlers.simpleComputer._ldap_post_create( self )
462
		self.nagios_ldap_post_create()
463
464
	def _ldap_pre_remove(self):
465
		self.open()
466
		if 'posix' in self.options and self.oldattr.get( 'uidNumber' ):
467
			self.uidNum=self.oldattr['uidNumber'][0]
468
469
	def _ldap_post_remove(self):
470
		if 'posix' in self.options:
471
			univention.admin.allocators.release(self.lo, self.position, 'uidNumber', self.uidNum)
472
		groupObjects=univention.admin.handlers.groups.group.lookup(self.co, self.lo, filter_s=filter_format('uniqueMember', [self.dn]))
473
		if groupObjects:
474
			for i in range(0, len(groupObjects)):
475
				groupObjects[i].open()
476
				if self.dn in groupObjects[i]['users']:
477
					groupObjects[i]['users'].remove(self.dn)
478
					groupObjects[i].modify(ignore_license=1)
479
480
		self.nagios_ldap_post_remove()
481
		univention.admin.handlers.simpleComputer._ldap_post_remove( self )
482
		# Need to clean up oldinfo. If remove was invoked, because the
483
		# creation of the object has failed, the next try will result in
484
		# a 'object class violation' (Bug #19343)
485
		self.oldinfo = {}
486
487
	def krb5_principal(self):
488
		domain=univention.admin.uldap.domain(self.lo, self.position)
489
		realm=domain.getKerberosRealm()
490
		if self.info.has_key('domain') and self.info['domain']:
491
			kerberos_domain=self.info['domain']
492
		else:
493
			kerberos_domain=domain.getKerberosRealm()
494
		return 'host/' + self['name']+'.'+kerberos_domain.lower()+'@'+realm
495
496
	def _ldap_post_modify(self):
497
		univention.admin.handlers.simpleComputer.primary_group( self )
498
		univention.admin.handlers.simpleComputer.update_groups( self )
499
		univention.admin.handlers.simpleComputer._ldap_post_modify( self )
500
		self.nagios_ldap_post_modify()
501
347
502
	def _ldap_pre_modify(self):
348
rewrite = object.rewrite
503
		if self.hasChanged('password'):
504
			if not self['password']:
505
				self['password']=self.oldattr.get('password',[''])[0]
506
				self.modifypassword=0
507
			elif not self.info['password']:
508
				self['password']=self.oldattr.get('password',[''])[0]
509
				self.modifypassword=0
510
			else:
511
				self.modifypassword=1
512
		self.nagios_ldap_pre_modify()
513
		univention.admin.handlers.simpleComputer._ldap_pre_modify( self )
514
515
516
	def _ldap_modlist(self):
517
		ml=univention.admin.handlers.simpleComputer._ldap_modlist( self )
518
519
		self.nagios_ldap_modlist(ml)
520
521
		if self.hasChanged('name'):
522
			if 'posix' in self.options:
523
				if hasattr(self, 'uidNum'):
524
					univention.admin.allocators.confirm(self.lo, self.position, 'uidNumber', self.uidNum)
525
				requested_uid="%s$" % self['name']
526
				try:
527
					self.uid=univention.admin.allocators.request(self.lo, self.position, 'uid', value=requested_uid)
528
				except Exception:
529
					self.cancel()
530
					raise univention.admin.uexceptions.uidAlreadyUsed, ': %s' % requested_uid
531
					return []
532
533
				self.alloc.append(('uid',self.uid))
534
535
				ml.append(('uid', self.oldattr.get('uid', [None])[0], self.uid))
536
537
			if 'samba' in self.options:
538
				ml.append(('displayName', self.oldattr.get('displayName', [None])[0], self['name']))
539
540
			if 'kerberos' in self.options:
541
				ml.append(('krb5PrincipalName', self.oldattr.get('krb5PrincipalName', []), [self.krb5_principal()]))
542
543
		if self.modifypassword and self['password']:
544
			if 'kerberos' in self.options:
545
				krb_keys=univention.admin.password.krb5_asn1(self.krb5_principal(), self['password'])
546
				krb_key_version=str(int(self.oldattr.get('krb5KeyVersionNumber', ['0'])[0])+1)
547
				ml.append(('krb5Key', self.oldattr.get('password', ['1']), krb_keys))
548
				ml.append(('krb5KeyVersionNumber', self.oldattr.get('krb5KeyVersionNumber', []), krb_key_version))
549
			if 'posix' in self.options:
550
				password_crypt = "{crypt}%s" % (univention.admin.password.crypt(self['password']))
551
				ml.append(('userPassword', self.oldattr.get('userPassword', [''])[0], password_crypt))
552
			if 'samba' in self.options:
553
				password_nt, password_lm = univention.admin.password.ntlm(self['password'])
554
				ml.append(('sambaNTPassword', self.oldattr.get('sambaNTPassword', [''])[0], password_nt))
555
				ml.append(('sambaLMPassword', self.oldattr.get('sambaLMPassword', [''])[0], password_lm))
556
				sambaPwdLastSetValue = str(long(time.time()))
557
				ml.append(('sambaPwdLastSet', self.oldattr.get('sambaPwdLastSet', [''])[0], sambaPwdLastSetValue))
558
559
		# add samba option
560
		if self.exists() and self.option_toggled('samba') and 'samba' in self.options:
561
			acctFlags=univention.admin.samba.acctFlags(flags={'W':1})
562
			if self.s4connector_present:
563
				# In this case Samba 4 must create the SID, the s4 connector will sync the
564
				# new sambaSID back from Samba 4.
565
				self.machineSid='S-1-4-%s' % self.oldattr['uidNumber'][0]
566
			else:
567
				self.machineSid = self.getMachineSid(self.lo, self.position, self.oldattr['uidNumber'][0], self.get('sambaRID'))
568
				self.alloc.append(('sid',self.machineSid))
569
			ml.append(('sambaSID', '', [self.machineSid]))
570
			ml.append(('sambaAcctFlags', '', [acctFlags.decode()]))
571
			ml.append(('displayName', '', self.info['name']))
572
			sambaPwdLastSetValue = str(long(time.time()))
573
			ml.append(('sambaPwdLastSet', self.oldattr.get('sambaPwdLastSet', [''])[0], sambaPwdLastSetValue))
574
		if self.exists() and self.option_toggled('samba') and 'samba' not in self.options:
575
			for key in [ 'sambaSID', 'sambaAcctFlags', 'sambaNTPassword', 'sambaLMPassword', 'sambaPwdLastSet', 'displayName' ]:
576
				if self.oldattr.get(key, []):
577
					ml.insert(0, (key, self.oldattr.get(key, []), ''))
578
579
		if self.hasChanged('sambaRID') and not hasattr(self, 'machineSid'):
580
			self.machineSid = self.getMachineSid(self.lo, self.position, self.oldattr['uidNumber'][0], self.get('sambaRID'))
581
			ml.append(('sambaSID', self.oldattr.get('sambaSID', ['']), [self.machineSid]))
582
583
		return ml
584
585
	def cleanup(self):
586
		self.open()
587
		self.nagios_cleanup()
588
		univention.admin.handlers.simpleComputer.cleanup( self )
589
590
	def cancel(self):
591
		for i,j in self.alloc:
592
			univention.debug.debug(univention.debug.ADMIN, univention.debug.WARN, 'cancel: release (%s): %s' % (i,j) )
593
			univention.admin.allocators.release(self.lo, self.position, i, j)
594
595
596
def rewrite(filter, mapping):
597
	if filter.variable == 'ip':
598
		filter.variable='aRecord'
599
	else:
600
		univention.admin.mapping.mapRewrite(filter, mapping)
601
349
602
def lookup(co, lo, filter_s, base='', superordinate=None, scope='sub', unique=0, required=0, timeout=-1, sizelimit=0):
350
def lookup(co, lo, filter_s, base='', superordinate=None, scope='sub', unique=0, required=0, timeout=-1, sizelimit=0):
603
351
(-)a/management/univention-directory-manager-modules/modules/univention/admin/handlers/computers/windows.py (-263 / +13 lines)
 Lines 30-50    Link Here 
30
# /usr/share/common-licenses/AGPL-3; if not, see
30
# /usr/share/common-licenses/AGPL-3; if not, see
31
# <http://www.gnu.org/licenses/>.
31
# <http://www.gnu.org/licenses/>.
32
32
33
from ldap.filter import filter_format
34
35
from univention.admin.layout import Tab, Group
33
from univention.admin.layout import Tab, Group
36
import univention.admin.filter
34
import univention.admin.filter
37
import univention.admin.handlers
35
import univention.admin.handlers
38
import univention.admin.password
39
import univention.admin.allocators
40
import univention.admin.localization
36
import univention.admin.localization
41
import univention.admin.uldap
42
import univention.admin.nagios as nagios
37
import univention.admin.nagios as nagios
43
import univention.admin.handlers.dns.forward_zone
38
from univention.admin.handlers.computers.base import computerBase
44
import univention.admin.handlers.dns.reverse_zone
45
import univention.admin.handlers.groups.group
46
import univention.admin.handlers.networks.network
47
import time
48
39
49
translation=univention.admin.localization.translation('univention.admin.handlers.computers')
40
translation=univention.admin.localization.translation('univention.admin.handlers.computers')
50
_=translation.translate
41
_=translation.translate
 Lines 346-623    Link Here 
346
mapping=univention.admin.mapping.mapping()
337
mapping=univention.admin.mapping.mapping()
347
mapping.register('name', 'cn', None, univention.admin.mapping.ListToString)
338
mapping.register('name', 'cn', None, univention.admin.mapping.ListToString)
348
mapping.register('description', 'description', None, univention.admin.mapping.ListToString)
339
mapping.register('description', 'description', None, univention.admin.mapping.ListToString)
349
mapping.register('operatingSystem', 'univentionOperatingSystem', None, univention.admin.mapping.ListToString)
350
mapping.register('operatingSystemVersion', 'univentionOperatingSystemVersion', None, univention.admin.mapping.ListToString)
351
mapping.register('domain', 'associatedDomain', None, univention.admin.mapping.ListToString)
340
mapping.register('domain', 'associatedDomain', None, univention.admin.mapping.ListToString)
352
mapping.register('inventoryNumber', 'univentionInventoryNumber')
341
mapping.register('inventoryNumber', 'univentionInventoryNumber')
353
mapping.register('mac', 'macAddress' )
342
mapping.register('mac', 'macAddress' )
354
mapping.register('network', 'univentionNetworkLink', None, univention.admin.mapping.ListToString)
343
mapping.register('network', 'univentionNetworkLink', None, univention.admin.mapping.ListToString)
355
mapping.register('unixhome', 'homeDirectory', None, univention.admin.mapping.ListToString)
344
mapping.register('unixhome', 'homeDirectory', None, univention.admin.mapping.ListToString)
356
mapping.register('shell', 'loginShell', None, univention.admin.mapping.ListToString)
345
mapping.register('shell', 'loginShell', None, univention.admin.mapping.ListToString)
346
mapping.register('operatingSystem', 'univentionOperatingSystem', None, univention.admin.mapping.ListToString)
347
mapping.register('operatingSystemVersion', 'univentionOperatingSystemVersion', None, univention.admin.mapping.ListToString)
357
348
358
# add Nagios extension
349
# add Nagios extension
359
nagios.addPropertiesMappingOptionsAndLayout(property_descriptions, mapping, options, layout)
350
nagios.addPropertiesMappingOptionsAndLayout(property_descriptions, mapping, options, layout)
360
351
361
352
362
class object(univention.admin.handlers.simpleComputer, nagios.Support):
353
class object(computerBase):
363
	module=module
354
	module=module
364
355
	mapping = mapping
365
	def __init__(self, co, lo, position, dn='', superordinate=None, attributes = [] ):
356
	CONFIG_NAME = 'computerGroup'
366
		univention.admin.handlers.simpleComputer.__init__(self, co, lo, position, dn, superordinate, attributes)
357
	DEFAULT_OCS = ['top', 'person', 'univentionHost', 'univentionWindows']
367
		nagios.Support.__init__(self)
358
	SAMBA_ACCOUNT_FLAG = 'W'
368
359
	SERVER_TYPE = 'univentionWindows'
369
	def open(self):
360
	SERVER_ROLE = 'windows_client'
370
		univention.admin.handlers.simpleComputer.open( self )
371
		self.nagios_open()
372
373
		self.modifypassword=0
374
		if self.exists():
375
			userPassword=self.oldattr.get('userPassword',[''])[0]
376
			if userPassword:
377
				self.info['password']=userPassword
378
				self.modifypassword=0
379
380
		if self.exists():
381
382
			if 'posix' in self.options and not self.info.get( 'primaryGroup' ):
383
				primaryGroupNumber=self.oldattr.get('gidNumber',[''])[0]
384
				univention.debug.debug(univention.debug.ADMIN, univention.debug.INFO, 'primary group number = %s' % (primaryGroupNumber))
385
				if primaryGroupNumber:
386
					primaryGroupResult=self.lo.searchDn(filter_format('(&(objectClass=posixGroup)(gidNumber=%s))', [primaryGroupNumber]))
387
					if primaryGroupResult:
388
						self['primaryGroup']=primaryGroupResult[0]
389
						univention.debug.debug(univention.debug.ADMIN, univention.debug.INFO, 'Set primary group = %s' % (self['primaryGroup']))
390
					else:
391
						self['primaryGroup']=None
392
						self.save()
393
						raise univention.admin.uexceptions.primaryGroup
394
				else:
395
					self['primaryGroup']=None
396
					self.save()
397
					raise univention.admin.uexceptions.primaryGroup
398
			if 'samba' in self.options:
399
				sid = self.oldattr.get('sambaSID', [''])[0]
400
				pos = sid.rfind('-')
401
				self.info['sambaRID'] = sid[pos+1:]
402
403
			self.save()
404
		else:
405
			self.modifypassword=0
406
			if 'posix' in self.options:
407
				res=univention.admin.config.getDefaultValue(self.lo, 'computerGroup', position=self.position)
408
				if res:
409
					self['primaryGroup']=res
410
411
412
	def _ldap_pre_create(self):
413
		super(object, self)._ldap_pre_create()
414
		if not self['password']:
415
			self['password']=self.oldattr.get('password',[''])[0]
416
			self.modifypassword=0
417
418
	def _ldap_addlist(self):
419
		ocs=['top', 'person', 'univentionHost', 'univentionWindows']
420
		al=[]
421
		if 'kerberos' in self.options:
422
			domain=univention.admin.uldap.domain(self.lo, self.position)
423
			realm=domain.getKerberosRealm()
424
425
			if realm:
426
				al.append(('krb5MaxLife', '86400'))
427
				al.append(('krb5MaxRenew', '604800'))
428
				al.append(('krb5KDCFlags', '126'))
429
				krb_key_version=str(int(self.oldattr.get('krb5KeyVersionNumber', ['0'])[0])+1)
430
				al.append(('krb5KeyVersionNumber', self.oldattr.get('krb5KeyVersionNumber', []), krb_key_version))
431
			else:
432
				# can't do kerberos
433
				self._remove_option( 'kerberos' )
434
		if 'posix' in self.options:
435
			self.uidNum=univention.admin.allocators.request(self.lo, self.position, 'uidNumber')
436
			self.alloc.append(('uidNumber',self.uidNum))
437
			gidNum = self.get_gid_for_primary_group()
438
			al.append(('uidNumber', [self.uidNum]))
439
			al.append(('gidNumber', [gidNum]))
440
441
		if self.modifypassword or self['password']:
442
			if 'kerberos' in self.options:
443
				krb_keys=univention.admin.password.krb5_asn1(self.krb5_principal(), self['password'])
444
				al.append(('krb5Key', self.oldattr.get('password', ['1']), krb_keys))
445
			if 'posix' in self.options:
446
				password_crypt = "{crypt}%s" % (univention.admin.password.crypt(self['password']))
447
				al.append(('userPassword', self.oldattr.get('userPassword', [''])[0], password_crypt))
448
			if 'samba' in self.options:
449
				password_nt, password_lm = univention.admin.password.ntlm(self['password'])
450
				al.append(('sambaNTPassword', self.oldattr.get('sambaNTPassword', [''])[0], password_nt))
451
				al.append(('sambaLMPassword', self.oldattr.get('sambaLMPassword', [''])[0], password_lm))
452
				sambaPwdLastSetValue = str(long(time.time()))
453
				al.append(('sambaPwdLastSet', self.oldattr.get('sambaPwdLastSet', [''])[0], sambaPwdLastSetValue))
454
			self.modifypassword=0
455
		if 'samba' in self.options:
456
			acctFlags=univention.admin.samba.acctFlags(flags={'W':1})
457
			if self.s4connector_present:
458
				# In this case Samba 4 must create the SID, the s4 connector will sync the
459
				# new sambaSID back from Samba 4.
460
				self.machineSid='S-1-4-%s' % self.uidNum
461
			else:
462
				self.machineSid = self.getMachineSid(self.lo, self.position, self.uidNum, self.get('sambaRID'))
463
				self.alloc.append(('sid',self.machineSid))
464
			al.append(('sambaSID', [self.machineSid]))
465
			al.append(('sambaAcctFlags', [acctFlags.decode()]))
466
			al.append(('displayName', self.info['name']))
467
468
		al.insert(0, ('objectClass', ocs))
469
		al.append(('univentionServerRole', '', 'windows_client'))
470
		return al
471
472
	def _ldap_post_create(self):
473
		if 'posix' in self.options:
474
			if hasattr(self, 'uid') and self.uid:
475
				univention.admin.allocators.confirm(self.lo, self.position, 'uid', self.uid)
476
			univention.admin.handlers.simpleComputer.primary_group( self )
477
			univention.admin.handlers.simpleComputer.update_groups( self )
478
		univention.admin.handlers.simpleComputer._ldap_post_create( self )
479
		self.nagios_ldap_post_create()
480
481
	def _ldap_pre_remove(self):
482
		self.open()
483
		if 'posix' in self.options and self.oldattr.get( 'uidNumber' ):
484
			self.uidNum=self.oldattr['uidNumber'][0]
485
486
	def _ldap_post_remove(self):
487
		if 'posix' in self.options:
488
			univention.admin.allocators.release(self.lo, self.position, 'uidNumber', self.uidNum)
489
		groupObjects=univention.admin.handlers.groups.group.lookup(self.co, self.lo, filter_s=filter_format('uniqueMember', [self.dn]))
490
		if groupObjects:
491
			for i in range(0, len(groupObjects)):
492
				groupObjects[i].open()
493
				if self.dn in groupObjects[i]['users']:
494
					groupObjects[i]['users'].remove(self.dn)
495
					groupObjects[i].modify(ignore_license=1)
496
497
		self.nagios_ldap_post_remove()
498
		univention.admin.handlers.simpleComputer._ldap_post_remove( self )
499
		# Need to clean up oldinfo. If remove was invoked, because the
500
		# creation of the object has failed, the next try will result in
501
		# a 'object class violation' (Bug #19343)
502
		self.oldinfo = {}
503
504
	def krb5_principal(self):
505
		domain=univention.admin.uldap.domain(self.lo, self.position)
506
		realm=domain.getKerberosRealm()
507
		if self.info.has_key('domain') and self.info['domain']:
508
			kerberos_domain=self.info['domain']
509
		else:
510
			kerberos_domain=domain.getKerberosRealm()
511
		return 'host/' + self['name']+'.'+kerberos_domain.lower()+'@'+realm
512
513
	def _ldap_post_modify(self):
514
		univention.admin.handlers.simpleComputer.primary_group( self )
515
		univention.admin.handlers.simpleComputer.update_groups( self )
516
		univention.admin.handlers.simpleComputer._ldap_post_modify( self )
517
		self.nagios_ldap_post_modify()
518
519
	def _ldap_pre_modify(self):
520
		if self.hasChanged('password'):
521
			if not self['password']:
522
				self['password']=self.oldattr.get('password',[''])[0]
523
				self.modifypassword=0
524
			elif not self.info['password']:
525
				self['password']=self.oldattr.get('password',[''])[0]
526
				self.modifypassword=0
527
			else:
528
				self.modifypassword=1
529
		self.nagios_ldap_pre_modify()
530
		univention.admin.handlers.simpleComputer._ldap_pre_modify( self )
531
532
361
533
	def _ldap_modlist(self):
362
	def _ldap_modlist(self):
534
		ml=univention.admin.handlers.simpleComputer._ldap_modlist( self )
363
		ml = super(object, self)._ldap_modlist()
535
536
		self.nagios_ldap_modlist(ml)
537
538
		if self.hasChanged('ntCompatibility') and self['ntCompatibility'] == '1':
364
		if self.hasChanged('ntCompatibility') and self['ntCompatibility'] == '1':
539
			self['password'] = self['name'].replace('$','').lower()
365
			self['password'] = self['name'].replace('$','').lower()
540
			self.modifypassword = 1
366
			self.modifypassword = 1
541
542
		if self.hasChanged('name'):
543
			if 'posix' in self.options:
544
				if hasattr(self, 'uidNum'):
545
					univention.admin.allocators.confirm(self.lo, self.position, 'uidNumber', self.uidNum)
546
				requested_uid="%s$" % self['name']
547
				try:
548
					self.uid=univention.admin.allocators.request(self.lo, self.position, 'uid', value=requested_uid)
549
				except Exception:
550
					self.cancel()
551
					raise univention.admin.uexceptions.uidAlreadyUsed, ': %s' % requested_uid
552
					return []
553
554
				self.alloc.append(('uid',self.uid))
555
556
				ml.append(('uid', self.oldattr.get('uid', [None])[0], self.uid))
557
558
			if 'samba' in self.options:
559
				ml.append(('displayName', self.oldattr.get('displayName', [None])[0], self['name']))
560
561
			if 'kerberos' in self.options:
562
				ml.append(('krb5PrincipalName', self.oldattr.get('krb5PrincipalName', []), [self.krb5_principal()]))
563
564
		if self.modifypassword and self['password']:
565
			if 'kerberos' in self.options:
566
				krb_keys=univention.admin.password.krb5_asn1(self.krb5_principal(), self['password'])
567
				krb_key_version=str(int(self.oldattr.get('krb5KeyVersionNumber', ['0'])[0])+1)
568
				ml.append(('krb5Key', self.oldattr.get('password', ['1']), krb_keys))
569
				ml.append(('krb5KeyVersionNumber', self.oldattr.get('krb5KeyVersionNumber', []), krb_key_version))
570
			if 'posix' in self.options:
571
				password_crypt = "{crypt}%s" % (univention.admin.password.crypt(self['password']))
572
				ml.append(('userPassword', self.oldattr.get('userPassword', [''])[0], password_crypt))
573
			if 'samba' in self.options:
574
				password_nt, password_lm = univention.admin.password.ntlm(self['password'])
575
				ml.append(('sambaNTPassword', self.oldattr.get('sambaNTPassword', [''])[0], password_nt))
576
				ml.append(('sambaLMPassword', self.oldattr.get('sambaLMPassword', [''])[0], password_lm))
577
				sambaPwdLastSetValue = str(long(time.time()))
578
				ml.append(('sambaPwdLastSet', self.oldattr.get('sambaPwdLastSet', [''])[0], sambaPwdLastSetValue))
579
580
		# add samba option
581
		if self.exists() and self.option_toggled('samba') and 'samba' in self.options:
582
			acctFlags=univention.admin.samba.acctFlags(flags={'W':1})
583
			if self.s4connector_present:
584
				# In this case Samba 4 must create the SID, the s4 connector will sync the
585
				# new sambaSID back from Samba 4.
586
				self.machineSid='S-1-4-%s' % self.oldattr['uidNumber'][0]
587
			else:
588
				self.machineSid = self.getMachineSid(self.lo, self.position, self.oldattr['uidNumber'][0], self.get('sambaRID'))
589
				self.alloc.append(('sid',self.machineSid))
590
			ml.append(('sambaSID', '', [self.machineSid]))
591
			ml.append(('sambaAcctFlags', '', [acctFlags.decode()]))
592
			ml.append(('displayName', '', self.info['name']))
593
			sambaPwdLastSetValue = str(long(time.time()))
594
			ml.append(('sambaPwdLastSet', self.oldattr.get('sambaPwdLastSet', [''])[0], sambaPwdLastSetValue))
595
		if self.exists() and self.option_toggled('samba') and 'samba' not in self.options:
596
			for key in [ 'sambaSID', 'sambaAcctFlags', 'sambaNTPassword', 'sambaLMPassword', 'sambaPwdLastSet', 'displayName' ]:
597
				if self.oldattr.get(key, []):
598
					ml.insert(0, (key, self.oldattr.get(key, []), ''))
599
600
		if self.hasChanged('sambaRID') and not hasattr(self, 'machineSid'):
601
			self.machineSid = self.getMachineSid(self.lo, self.position, self.oldattr['uidNumber'][0], self.get('sambaRID'))
602
			ml.append(('sambaSID', self.oldattr.get('sambaSID', ['']), [self.machineSid]))
603
604
		return ml
367
		return ml
368
del object.link
605
369
606
	def cleanup(self):
370
rewrite = object.rewrite
607
		self.open()
608
		self.nagios_cleanup()
609
		univention.admin.handlers.simpleComputer.cleanup( self )
610
611
	def cancel(self):
612
		for i,j in self.alloc:
613
			univention.debug.debug(univention.debug.ADMIN, univention.debug.WARN, 'cancel: release (%s): %s' % (i,j) )
614
			univention.admin.allocators.release(self.lo, self.position, i, j)
615
616
def rewrite(filter, mapping):
617
	if filter.variable == 'ip':
618
		filter.variable='aRecord'
619
	else:
620
		univention.admin.mapping.mapRewrite(filter, mapping)
621
371
622
def lookup(co, lo, filter_s, base='', superordinate=None, scope='sub', unique=0, required=0, timeout=-1, sizelimit=0):
372
def lookup(co, lo, filter_s, base='', superordinate=None, scope='sub', unique=0, required=0, timeout=-1, sizelimit=0):
623
373
(-)a/management/univention-directory-manager-modules/modules/univention/admin/handlers/computers/windows_domaincontroller.py (-262 / +10 lines)
 Lines 30-50    Link Here 
30
# /usr/share/common-licenses/AGPL-3; if not, see
30
# /usr/share/common-licenses/AGPL-3; if not, see
31
# <http://www.gnu.org/licenses/>.
31
# <http://www.gnu.org/licenses/>.
32
32
33
from ldap.filter import filter_format
34
35
from univention.admin.layout import Tab, Group
33
from univention.admin.layout import Tab, Group
36
import univention.admin.filter
34
import univention.admin.filter
37
import univention.admin.handlers
35
import univention.admin.handlers
38
import univention.admin.password
39
import univention.admin.allocators
40
import univention.admin.localization
36
import univention.admin.localization
41
import univention.admin.uldap
42
import univention.admin.nagios as nagios
37
import univention.admin.nagios as nagios
43
import univention.admin.handlers.dns.forward_zone
38
from univention.admin.handlers.computers.base import computerBase
44
import univention.admin.handlers.dns.reverse_zone
45
import univention.admin.handlers.groups.group
46
import univention.admin.handlers.networks.network
47
import time
48
39
49
translation=univention.admin.localization.translation('univention.admin.handlers.computers')
40
translation=univention.admin.localization.translation('univention.admin.handlers.computers')
50
_=translation.translate
41
_=translation.translate
 Lines 368-624    Link Here 
368
nagios.addPropertiesMappingOptionsAndLayout(property_descriptions, mapping, options, layout)
359
nagios.addPropertiesMappingOptionsAndLayout(property_descriptions, mapping, options, layout)
369
360
370
361
371
class object(univention.admin.handlers.simpleComputer, nagios.Support):
362
class object(computerBase):
372
	module=module
363
	module=module
364
	mapping = mapping
365
	CONFIG_NAME = 'univentionDefaultDomainControllerGroup'
366
	DEFAULT_OCS = ['top', 'person', 'univentionHost', 'univentionWindows']
367
	SAMBA_ACCOUNT_FLAG = 'S'
368
	SERVER_TYPE = 'univentionWindows'
369
	SERVER_ROLE = 'windows_domaincontroller'
373
370
374
	def __init__(self, co, lo, position, dn='', superordinate=None, attributes = [] ):
371
rewrite = object.rewrite
375
		univention.admin.handlers.simpleComputer.__init__(self, co, lo, position, dn, superordinate, attributes)
372
identify = object.identify
376
		nagios.Support.__init__(self)
377
378
	def open(self):
379
		univention.admin.handlers.simpleComputer.open( self )
380
		self.nagios_open()
381
382
		self.modifypassword=0
383
		if self.exists():
384
			userPassword=self.oldattr.get('userPassword',[''])[0]
385
			if userPassword:
386
				self.info['password']=userPassword
387
				self.modifypassword=0
388
389
		if self.exists():
390
391
			if 'posix' in self.options and not self.info.get( 'primaryGroup' ):
392
				primaryGroupNumber=self.oldattr.get('gidNumber',[''])[0]
393
				univention.debug.debug(univention.debug.ADMIN, univention.debug.INFO, 'primary group number = %s' % (primaryGroupNumber))
394
				if primaryGroupNumber:
395
					primaryGroupResult=self.lo.searchDn(filter_format('(&(objectClass=posixGroup)(gidNumber=%s))', [primaryGroupNumber]))
396
					if primaryGroupResult:
397
						self['primaryGroup']=primaryGroupResult[0]
398
						univention.debug.debug(univention.debug.ADMIN, univention.debug.INFO, 'Set primary group = %s' % (self['primaryGroup']))
399
					else:
400
						self['primaryGroup']=None
401
						self.save()
402
						raise univention.admin.uexceptions.primaryGroup
403
				else:
404
					self['primaryGroup']=None
405
					self.save()
406
					raise univention.admin.uexceptions.primaryGroup
407
			if 'samba' in self.options:
408
				sid = self.oldattr.get('sambaSID', [''])[0]
409
				pos = sid.rfind('-')
410
				self.info['sambaRID'] = sid[pos+1:]
411
412
			self.save()
413
414
		else:
415
			self.modifypassword=0
416
			if 'posix' in self.options:
417
				res=univention.admin.config.getDefaultValue(self.lo, 'univentionDefaultDomainControllerGroup', position=self.position)
418
				if res:
419
					self['primaryGroup']=res
420
421
	def _ldap_pre_create(self):
422
		super(object, self)._ldap_pre_create()
423
		if not self['password']:
424
			self['password']=self.oldattr.get('password',[''])[0]
425
			self.modifypassword=0
426
427
	def _ldap_addlist(self):
428
		ocs=['top', 'person', 'univentionHost', 'univentionWindows']
429
		al=[]
430
		if 'kerberos' in self.options:
431
432
			ocs.extend(['krb5Principal', 'krb5KDCEntry'])
433
			al.append(('krb5MaxLife', '86400'))
434
			al.append(('krb5MaxRenew', '604800'))
435
			al.append(('krb5KDCFlags', '126'))
436
			krb_key_version=str(int(self.oldattr.get('krb5KeyVersionNumber', ['0'])[0])+1)
437
			al.append(('krb5KeyVersionNumber', self.oldattr.get('krb5KeyVersionNumber', []), krb_key_version))
438
439
		if 'posix' in self.options:
440
			self.uidNum=univention.admin.allocators.request(self.lo, self.position, 'uidNumber')
441
			self.alloc.append(('uidNumber',self.uidNum))
442
			gidNum = self.get_gid_for_primary_group()
443
			al.append(('uidNumber', [self.uidNum]))
444
			al.append(('gidNumber', [gidNum]))
445
446
		if self.modifypassword or self['password']:
447
			if 'kerberos' in self.options:
448
				krb_keys=univention.admin.password.krb5_asn1(self.krb5_principal(), self['password'])
449
				al.append(('krb5Key', self.oldattr.get('password', ['1']), krb_keys))
450
			if 'posix' in self.options:
451
				password_crypt = "{crypt}%s" % (univention.admin.password.crypt(self['password']))
452
				al.append(('userPassword', self.oldattr.get('userPassword', [''])[0], password_crypt))
453
			if 'samba' in self.options:
454
				password_nt, password_lm = univention.admin.password.ntlm(self['password'])
455
				al.append(('sambaNTPassword', self.oldattr.get('sambaNTPassword', [''])[0], password_nt))
456
				al.append(('sambaLMPassword', self.oldattr.get('sambaLMPassword', [''])[0], password_lm))
457
				sambaPwdLastSetValue = str(long(time.time()))
458
				al.append(('sambaPwdLastSet', self.oldattr.get('sambaPwdLastSet', [''])[0], sambaPwdLastSetValue))
459
			self.modifypassword=0
460
		if 'samba' in self.options:
461
			acctFlags=univention.admin.samba.acctFlags(flags={'S':1})
462
			if self.s4connector_present:
463
				# In this case Samba 4 must create the SID, the s4 connector will sync the
464
				# new sambaSID back from Samba 4.
465
				self.machineSid='S-1-4-%s' % self.uidNum
466
			else:
467
				self.machineSid = self.getMachineSid(self.lo, self.position, self.uidNum, self.get('sambaRID'))
468
				self.alloc.append(('sid',self.machineSid))
469
			al.append(('sambaSID', [self.machineSid]))
470
			al.append(('sambaAcctFlags', [acctFlags.decode()]))
471
			al.append(('displayName', self.info['name']))
472
473
		al.insert(0, ('objectClass', ocs))
474
		al.append(('univentionServerRole', '', 'windows_domaincontroller'))
475
		return al
476
477
	def _ldap_post_create(self):
478
		if 'posix' in self.options:
479
			if hasattr(self, 'uid') and self.uid:
480
				univention.admin.allocators.confirm(self.lo, self.position, 'uid', self.uid)
481
			univention.admin.handlers.simpleComputer.primary_group( self )
482
			univention.admin.handlers.simpleComputer.update_groups( self )
483
		univention.admin.handlers.simpleComputer._ldap_post_create( self )
484
		self.nagios_ldap_post_create()
485
486
	def _ldap_pre_remove(self):
487
		self.open()
488
		if 'posix' in self.options and self.oldattr.get( 'uidNumber' ):
489
			self.uidNum=self.oldattr['uidNumber'][0]
490
491
	def _ldap_post_remove(self):
492
		if 'posix' in self.options:
493
			univention.admin.allocators.release(self.lo, self.position, 'uidNumber', self.uidNum)
494
		groupObjects=univention.admin.handlers.groups.group.lookup(self.co, self.lo, filter_s=filter_format('uniqueMember', [self.dn]))
495
		if groupObjects:
496
			for i in range(0, len(groupObjects)):
497
				groupObjects[i].open()
498
				if self.dn in groupObjects[i]['users']:
499
					groupObjects[i]['users'].remove(self.dn)
500
					groupObjects[i].modify(ignore_license=1)
501
502
		self.nagios_ldap_post_remove()
503
		univention.admin.handlers.simpleComputer._ldap_post_remove( self )
504
		# Need to clean up oldinfo. If remove was invoked, because the
505
		# creation of the object has failed, the next try will result in
506
		# a 'object class violation' (Bug #19343)
507
		self.oldinfo = {}
508
509
	def krb5_principal(self):
510
		domain=univention.admin.uldap.domain(self.lo, self.position)
511
		realm=domain.getKerberosRealm()
512
		if self.info.has_key('domain') and self.info['domain']:
513
			kerberos_domain=self.info['domain']
514
		else:
515
			kerberos_domain=domain.getKerberosRealm()
516
		return 'host/' + self['name']+'.'+kerberos_domain.lower()+'@'+realm
517
518
	def _ldap_post_modify(self):
519
		univention.admin.handlers.simpleComputer.primary_group( self )
520
		univention.admin.handlers.simpleComputer.update_groups( self )
521
		univention.admin.handlers.simpleComputer._ldap_post_modify( self )
522
		self.nagios_ldap_post_modify()
523
524
	def _ldap_pre_modify(self):
525
		if self.hasChanged('password'):
526
			if not self['password']:
527
				self['password']=self.oldattr.get('password',[''])[0]
528
				self.modifypassword=0
529
			elif not self.info['password']:
530
				self['password']=self.oldattr.get('password',[''])[0]
531
				self.modifypassword=0
532
			else:
533
				self.modifypassword=1
534
		self.nagios_ldap_pre_modify()
535
		univention.admin.handlers.simpleComputer._ldap_pre_modify( self )
536
537
538
	def _ldap_modlist(self):
539
		ml=univention.admin.handlers.simpleComputer._ldap_modlist( self )
540
541
		self.nagios_ldap_modlist(ml)
542
543
		if self.hasChanged('name'):
544
			if 'posix' in self.options:
545
				if hasattr(self, 'uidNum'):
546
					univention.admin.allocators.confirm(self.lo, self.position, 'uidNumber', self.uidNum)
547
				requested_uid="%s$" % self['name']
548
				try:
549
					self.uid=univention.admin.allocators.request(self.lo, self.position, 'uid', value=requested_uid)
550
				except Exception:
551
					self.cancel()
552
					raise univention.admin.uexceptions.uidAlreadyUsed, ': %s' % requested_uid
553
					return []
554
555
				self.alloc.append(('uid',self.uid))
556
557
				ml.append(('uid', self.oldattr.get('uid', [None])[0], self.uid))
558
559
			if 'samba' in self.options:
560
				ml.append(('displayName', self.oldattr.get('displayName', [None])[0], self['name']))
561
562
			if 'kerberos' in self.options:
563
				ml.append(('krb5PrincipalName', self.oldattr.get('krb5PrincipalName', []), [self.krb5_principal()]))
564
565
		if self.modifypassword and self['password']:
566
			if 'kerberos' in self.options:
567
				krb_keys=univention.admin.password.krb5_asn1(self.krb5_principal(), self['password'])
568
				krb_key_version=str(int(self.oldattr.get('krb5KeyVersionNumber', ['0'])[0])+1)
569
				ml.append(('krb5Key', self.oldattr.get('password', ['1']), krb_keys))
570
				ml.append(('krb5KeyVersionNumber', self.oldattr.get('krb5KeyVersionNumber', []), krb_key_version))
571
			if 'posix' in self.options:
572
				password_crypt = "{crypt}%s" % (univention.admin.password.crypt(self['password']))
573
				ml.append(('userPassword', self.oldattr.get('userPassword', [''])[0], password_crypt))
574
			if 'samba' in self.options:
575
				password_nt, password_lm = univention.admin.password.ntlm(self['password'])
576
				ml.append(('sambaNTPassword', self.oldattr.get('sambaNTPassword', [''])[0], password_nt))
577
				ml.append(('sambaLMPassword', self.oldattr.get('sambaLMPassword', [''])[0], password_lm))
578
				sambaPwdLastSetValue = str(long(time.time()))
579
				ml.append(('sambaPwdLastSet', self.oldattr.get('sambaPwdLastSet', [''])[0], sambaPwdLastSetValue))
580
581
		# add samba option
582
		if self.exists() and self.option_toggled('samba') and 'samba' in self.options:
583
			acctFlags=univention.admin.samba.acctFlags(flags={'S':1})
584
			if self.s4connector_present:
585
				# In this case Samba 4 must create the SID, the s4 connector will sync the
586
				# new sambaSID back from Samba 4.
587
				self.machineSid='S-1-4-%s' % self.oldattr['uidNumber'][0]
588
			else:
589
				self.machineSid = self.getMachineSid(self.lo, self.position, self.oldattr['uidNumber'][0], self.get('sambaRID'))
590
				self.alloc.append(('sid',self.machineSid))
591
			ml.append(('sambaSID', '', [self.machineSid]))
592
			ml.append(('sambaAcctFlags', '', [acctFlags.decode()]))
593
			ml.append(('displayName', '', self.info['name']))
594
			sambaPwdLastSetValue = str(long(time.time()))
595
			ml.append(('sambaPwdLastSet', self.oldattr.get('sambaPwdLastSet', [''])[0], sambaPwdLastSetValue))
596
		if self.exists() and self.option_toggled('samba') and 'samba' not in self.options:
597
			for key in [ 'sambaSID', 'sambaAcctFlags', 'sambaNTPassword', 'sambaLMPassword', 'sambaPwdLastSet', 'displayName' ]:
598
				if self.oldattr.get(key, []):
599
					ml.insert(0, (key, self.oldattr.get(key, []), ''))
600
601
		if self.hasChanged('sambaRID') and not hasattr(self, 'machineSid'):
602
			self.machineSid = self.getMachineSid(self.lo, self.position, self.oldattr['uidNumber'][0], self.get('sambaRID'))
603
			ml.append(('sambaSID', self.oldattr.get('sambaSID', ['']), [self.machineSid]))
604
605
		return ml
606
607
	def cleanup(self):
608
		self.open()
609
		self.nagios_cleanup()
610
		univention.admin.handlers.simpleComputer.cleanup( self )
611
612
	def cancel(self):
613
		for i,j in self.alloc:
614
			univention.debug.debug(univention.debug.ADMIN, univention.debug.WARN, 'cancel: release (%s): %s' % (i,j) )
615
			univention.admin.allocators.release(self.lo, self.position, i, j)
616
617
def rewrite(filter, mapping):
618
	if filter.variable == 'ip':
619
		filter.variable='aRecord'
620
	else:
621
		univention.admin.mapping.mapRewrite(filter, mapping)
622
373
623
def lookup(co, lo, filter_s, base='', superordinate=None, scope='sub', unique=0, required=0, timeout=-1, sizelimit=0):
374
def lookup(co, lo, filter_s, base='', superordinate=None, scope='sub', unique=0, required=0, timeout=-1, sizelimit=0):
624
375
 Lines 643-648   def lookup(co, lo, filter_s, base='', superordinate=None, scope='sub', unique=0, Link Here 
643
		for dn, attrs in lo.search(unicode(filter), base, scope, [], unique, required, timeout, sizelimit):
394
		for dn, attrs in lo.search(unicode(filter), base, scope, [], unique, required, timeout, sizelimit):
644
			res.append( object( co, lo, None, dn, attributes = attrs ) )
395
			res.append( object( co, lo, None, dn, attributes = attrs ) )
645
	return res
396
	return res
646
647
def identify(dn, attr, canonical=0):
648
	return 'univentionHost' in attr.get('objectClass', []) and 'univentionWindows' in attr.get('objectClass', []) and 'windows_domaincontroller' in attr.get('univentionServerRole', [])

Return to bug 41659