Example #1
0
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)
Example #2
0
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))
Example #3
0
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))
Example #4
0
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)
Example #6
0
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()))
Example #7
0
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)
Example #8
0
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()))
Example #9
0
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'])
Example #10
0
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'])