def check_alias(db, cl, nodeid, new_values): for i in 'name', 'org_location': if i in new_values and not new_values[i]: raise Reject, "%(attr)s may not be undefined" % {'attr': _(i)} name = new_values.get('name', cl.get(nodeid, 'name')) a2a = new_values.get('alias_to_alias', cl.get(nodeid, 'alias_to_alias')) a2u = new_values.get('alias_to_user', cl.get(nodeid, 'alias_to_user')) olo = new_values.get('org_location', cl.get(nodeid, 'org_location')) olon = _('org_location') if not (a2a or a2u): raise Reject, _ ("Either %(a_alias)s or %(u_alias)s must be defined") \ % dict (a_alias = _ ('alias_to_alias'), u_alias = _ ('alias_to_user')) if 'alias_to_alias' in new_values: new_values['alias_to_alias'] = common.sort_uniq(a2a) if 'alias_to_user' in new_values: new_values['alias_to_user'] = common.sort_uniq(a2u) if 'org_location' in new_values and a2a: check_alias_consistency(cl, name, olo, a2a) reject_if_alias_has_depends \ ( cl, nodeid , _ ("May not change %(olon)s if dependencies exist") % locals () ) if 'name' in new_values or 'org_location' in new_values: common.check_unique(_, cl, nodeid, name=name, org_location=olo) if 'name' in new_values or 'alias_to_alias' in new_values: common.check_loop(_, cl, nodeid, 'alias_to_alias', a2a)
def new_smb_machine(db, cl, nodeid, new_values): common.require_attributes \ (_, cl, nodeid, new_values, 'smb_domain', 'machine_name') sd = db.smb_domain.getnode(new_values['smb_domain']) if 'smb_domain' in new_values and 'machine_uid' not in new_values: new_values ['machine_uid'] = common.next_uid_or_gid \ (sd.last_machine_uid, sd.machine_uid_range) mu = new_values['machine_uid'] common.check_unique(_, cl, nodeid, machine_uid=mu) db.smb_domain.set(sd.id, last_machine_uid=max(sd.last_machine_uid, mu))
def check_and_update_gid(_, db, cl, nodeid, sd, gid): is_other = common.uid_or_gid_in_range(gid, sd.gid_range) is_person = common.uid_or_gid_in_range(gid, sd.private_gid_range) if not is_other and not is_person and gid != sd.machine_group: gname = _('gid') sdname = _('smb_domain') raise Reject, _("Invalid %(gname)s: %(gid)s for %(sdname)s") % locals() common.check_unique(_, cl, nodeid, gid=gid) if is_other: db.smb_domain.set(sd.id, last_gid=max(gid, sd.last_gid))
def new_alias(db, cl, nodeid, new_values): common.require_attributes \ (_, cl, nodeid, new_values, 'name', 'org_location') if not ('alias_to_alias' in new_values or 'alias_to_user' in new_values): raise Reject, _ ("Either %(a_alias)s or %(u_alias)s must be defined") \ % dict (a_alias = _ ('alias_to_alias'), u_alias = _ ('alias_to_user')) name = new_values['name'] olo = new_values['org_location'] common.check_unique(_, cl, nodeid, name=name, org_location=olo) if 'alias_to_alias' in new_values: a2a = new_values['alias_to_alias'] new_values['alias_to_alias'] = common.sort_uniq(a2a) check_alias_consistency(cl, name, olo, a2a) common.check_loop(_, cl, nodeid, 'alias_to_alias', a2a) if 'alias_to_user' in new_values: a2u = new_values['alias_to_user'] new_values['alias_to_user'] = common.sort_uniq(a2u)
def check_maildomain (db, cl, nodeid, new_values) : """ Delete maildomain if setting customer to invalid. Otherwise check that maildomain isn't a duplicate and is wellformed. """ ovalid = None if nodeid : ovalid = cl.get (nodeid, 'is_valid') valid = new_values.get ('is_valid', ovalid) if not valid : new_values ['maildomain'] = None md = new_values.get ('maildomain', None) if not md : return if '.' not in md : raise Reject, \ _ ('Toplevel domain "%(maildomain)s" not allowed, ' 'must contain "."' ) \ % dict (maildomain = _ ('maildomain')) md = new_values ['maildomain'] = md.lower () common.check_unique (_, cl, nodeid, maildomain = md)
def common_user_checks(db, cl, nodeid, new_values): ''' Make sure user properties are valid. - email address has no spaces in it - roles specified exist ''' if ('address' in new_values and new_values['address'] and ' ' in new_values['address']): raise ValueError, 'Email address must not contain spaces' common.check_roles(db, cl, nodeid, new_values) # automatic setting of realname if 'firstname' in cl.properties: n = 'firstname' fn = new_values.get(n, None) or cl.get(nodeid, n) or '' n = 'lastname' ln = new_values.get(n, None) or cl.get(nodeid, n) or '' if (new_values.has_key("firstname") or new_values.has_key("lastname")): realname = " ".join((fn, ln)) new_values["realname"] = realname if 'lunch_duration' in new_values: ld = new_values['lunch_duration'] if ld * 3600 % 900: raise Reject, _("Times must be given in quarters of an hour") new_values['lunch_duration'] = int(ld * 4) / 4. if ld > 8: raise Reject, _("Lunchbreak of more than 8 hours? Sure?") if ld < .5: raise Reject, _("Lunchbreak must be at least half an hour.") if 'lunch_start' in new_values: ls = new_values['lunch_start'] ls = Date(ls) # trigger date-spec error if this fails. if 'tt_lines' in new_values: ttl = new_values['tt_lines'] if ttl < 1: new_values['tt_lines'] = 1 if ttl > 5: new_values['tt_lines'] = 5 if 'supervisor' in new_values: common.check_loop \ (_, cl, nodeid, 'supervisor', new_values ['supervisor']) # Allow nickname to be empty # Nick must be unique and must not collide with a username # This is checked in both directions if 'nickname' in new_values and new_values['nickname']: v = new_values['nickname'] common.check_unique(_, cl, nodeid, nickname=v) common.check_unique(_, cl, nodeid, username=v) if 'nickname' in cl.properties and 'username' in new_values: common.check_unique(_, cl, nodeid, nickname=new_values['username']) for k in maxlen: if k in new_values: if new_values[k] is None: continue if len(new_values[k]) > maxlen[k]: fn = _(k) l = maxlen[k] raise Reject(_('%(fn)s too long: > %(l)s' % locals()))
def _check_for_description (db, cl, nodeid, newvalues) : """Checks that `description` is given and unique.""" common.require_attributes (_, cl, nodeid, newvalues, 'description') if 'description' in newvalues : desc = newvalues ['description'] common.check_unique (_, cl, nodeid, description = desc)
def common_user_checks(db, cl, nodeid, new_values): ''' Make sure user properties are valid. - email address has no spaces in it - roles specified exist ''' if 'org_location' in cl.properties: olo = new_values.get('org_location') if not olo and nodeid: olo = cl.get(nodeid, 'org_location') if not olo and nodeid and 'user_dynamic' in cl.properties: dyn = get_user_dynamic(db, nodeid, Date('.')) if dyn: olo = new_values['org_location'] = dyn.org_location new_values['department'] = dyn.department if ('address' in new_values and new_values['address'] and ' ' in new_values['address']): raise ValueError, 'Email address must not contain spaces' common.check_roles(db, cl, nodeid, new_values) # automatic setting of realname if 'firstname' in cl.properties: n = 'firstname' fn = new_values.get(n, None) or cl.get(nodeid, n) or '' n = 'lastname' ln = new_values.get(n, None) or cl.get(nodeid, n) or '' if (new_values.has_key("firstname") or new_values.has_key("lastname")): realname = " ".join((fn, ln)) new_values["realname"] = realname if 'lunch_duration' in new_values: ld = new_values['lunch_duration'] if ld * 3600 % 900: raise Reject, _("Times must be given in quarters of an hour") new_values['lunch_duration'] = int(ld * 4) / 4. if ld > 8: raise Reject, _("Lunchbreak of more than 8 hours? Sure?") if ld < .5: raise Reject, _("Lunchbreak must be at least half an hour.") if 'lunch_start' in new_values: ls = new_values['lunch_start'] ls = Date(ls) # trigger date-spec error if this fails. if 'tt_lines' in new_values: ttl = new_values['tt_lines'] if ttl < 1: new_values['tt_lines'] = 1 if ttl > 5: new_values['tt_lines'] = 5 if 'supervisor' in new_values: common.check_loop \ (_, cl, nodeid, 'supervisor', new_values ['supervisor']) for a in 'uid', 'nickname': if a in new_values: v = new_values[a] # Allow nickname to be empty if a == 'nickname' and not v: continue common.check_unique(_, cl, nodeid, **{a: v}) if a == 'nickname': common.check_unique(_, cl, nodeid, username=v) if 'nickname' in cl.properties and 'username' in new_values: common.check_unique(_, cl, nodeid, nickname=new_values['username']) if 'uid' in new_values and new_values['uid']: if not olo: raise Reject, _("%(uid)s specified for user without %(org_loc)s") \ % dict (uid = _('uid'), org_loc = _('org_location')) uid = new_values['uid'] uidname = _('uid') id = db.org_location.get(olo, 'smb_domain') if id: sd = db.smb_domain.getnode(id) if not common.uid_or_gid_in_range(uid, sd.uid_range): raise Reject, _("Invalid %(uidname)s: %(uid)s") % locals() db.smb_domain.set(sd.id, last_uid=max(uid, sd.last_uid)) else: raise Reject, _ \ ("%(uidname)s specified but no samba domain configured") for k in maxlen: if k in new_values: if new_values[k] is None: continue if len(new_values[k]) > maxlen[k]: fn = _(k) l = maxlen[k] raise Reject(_('%(fn)s too long: > %(l)s' % locals()))
def new_smb_domain(db, cl, nodeid, new_values): common.require_attributes(_, cl, nodeid, new_values, 'name', 'sid') common.check_unique(_, cl, nodeid, sid=new_values['sid'])
def check_smb_domain(db, cl, nodeid, new_values): for i in 'name', 'sid': if i in new_values and not new_values[i]: raise Reject, "%(attr)s may not be undefined" % {'attr': _(i)} if 'sid' in new_values: common.check_unique(_, cl, nodeid, sid=new_values['sid'])