Clear status in pop_window()
[public/pyceo-broken.git] / pylib / csc / adm / accounts.py
index d0b2c87..2b28750 100644 (file)
@@ -190,8 +190,15 @@ def create(username, name, minimum_id, maximum_id, home, password=None, descript
 
     ### User creation ###
 
-    # create the LDAP entry
-    ldap_connection.user_add(username, name, userid, gid, home, shell, gecos, description)
+    if not ldap_connection.user_lookup(username):
+
+        # create the LDAP entry
+        ldap_connection.account_add(username, name, userid, gid, home, shell, gecos, description)
+
+    else:
+
+        # add the required attribute to the LDAP entry
+        ldap_connection.member_add_account(username, userid, gid, home, shell, gecos)
 
     # create a user group if no other group was specified
     if not group:
@@ -257,7 +264,7 @@ def status(username):
     Returns: a boolean 2-tuple (exists, has_password)
     """
 
-    ldap_state = ldap_connection.user_lookup(username)
+    ldap_state = ldap_connection.account_lookup(username)
     krb_state = krb_connection.get_principal(username)
     return (ldap_state is not None, krb_state is not None)
 
@@ -332,7 +339,7 @@ def update_gecos(username, gecos_data):
     is also updated with the user's full name.
 
     See build_gecos() and parse_gecos() for help dealing with
-    the chfn(1) GEOCS format.
+    the chfn(1) GECOS format.
 
     Use update_name() to update the name porition, as it will update
     the LDAP 'cn' atribute as well.
@@ -412,7 +419,7 @@ def update_shell(username, shell, check=True):
 
     # reject nonexistent or nonexecutable shells
     if not os.access(shell, os.X_OK) or not os.path.isfile(shell):
-        raise InvalidArgument("shell", shell, "is not a regular executable file")
+        raise InvalidArgument("shell", shell, "not an executable file")
 
     if check:
         
@@ -485,7 +492,6 @@ def create_group(groupname, minimum_id=None, maximum_id=None, description=''):
         description - description LDAP attribute
 
     Exceptions:
-        GroupExists    - when the group name conflicts with an existing group
         NoAvailableIDs - when the ID range is exhausted
         GroupException - when not connected
         LDAPException  - on LDAP failure
@@ -649,18 +655,14 @@ def remove_member(username, groupname):
 
 ### Account Types ###
 
-def create_member(username, password, name, memberid):
+def create_member(username, password, name):
     """
     Creates a UNIX user account with options tailored to CSC members.
 
-    Note: The 'other' section of the GECOS field is filled with the CSC
-          memberid. This section cannot be changed by the user via chfn(1).
-
     Parameters:
         username - the desired UNIX username
         password - the desired UNIX password
         name     - the member's real name
-        memberid - the CSC member id number
 
     Exceptions:
         InvalidArgument - on bad account attributes provided
@@ -686,24 +688,20 @@ def create_member(username, password, name, memberid):
     maximum_id = cfg['member_max_id']
     home = cfg['member_home'] + '/' + username
     description = cfg['member_desc']
-    gecos_field = build_gecos(name, other=memberid)
+    gecos_field = build_gecos(name)
     shell = cfg['member_shell']
     group = cfg['member_group']
 
     return create(username, name, minimum_id, maximum_id, home, password, description, gecos_field, shell, group)
 
 
-def create_club(username, name, memberid):
+def create_club(username, name):
     """
     Creates a UNIX user account with options tailored to CSC-hosted clubs.
     
-    Note: The 'other' section of the GECOS field is filled with the CSC
-          memberid. This section cannot be changed by the user via chfn(1).
-
     Parameters:
         username - the desired UNIX username
         name     - the club name
-        memberid - the CSC member id number
 
     Exceptions:
         InvalidArgument - on bad account attributes provided
@@ -726,7 +724,7 @@ def create_club(username, name, memberid):
     maximum_id = cfg['club_max_id']
     home = cfg['club_home'] + '/' + username
     description = cfg['club_desc']
-    gecos_field = build_gecos(name, other=memberid)
+    gecos_field = build_gecos(name)
     shell = cfg['club_shell']
     group = cfg['club_group']
 
@@ -787,9 +785,9 @@ def check_name_usage(name):
     """
 
     # see if user exists in LDAP
-    if ldap_connection.user_lookup(name):
+    if ldap_connection.account_lookup(name):
         raise NameConflict(name, "account", "LDAP")
-    
+
     # see if group exists in LDAP
     if ldap_connection.group_lookup(name):
         raise NameConflict(name, "group", "LDAP")
@@ -816,10 +814,10 @@ def check_name_usage(name):
 
 def check_account_status(username, require_ldap=True, require_krb=False):
     """Helper function to verify that an account exists."""
-    
-    if not connected(): 
+
+    if not connected():
         raise AccountException("Not connected to LDAP and Kerberos")
-    if require_ldap and not ldap_connection.user_lookup(username):
+    if require_ldap and not ldap_connection.account_lookup(username):
         raise NoSuchAccount(username, "LDAP")
     if require_krb and not krb_connection.get_principal(username):
         raise NoSuchAccount(username, "KRB")
@@ -892,14 +890,18 @@ def build_gecos(fullname=None, roomnumber=None, workphone=None, homephone=None,
     if other and ':' in str(other):
         raise InvalidArgument('other', other, "invalid characters")
     
-    # append each field
+    # join the fields
     if fullname is not None:
         gecos_data = str(fullname)
-    for field in (roomnumber, workphone, homephone, other):
-        if field is not None:
-            gecos_data += ',' + str(field)
-
-    return gecos_data
+    fields = [ fullname, roomnumber, workphone, homephone, other ]
+    for idx in xrange(len(fields), 0, -1):
+        if not fields[idx-1]:
+            fields.pop()
+        else:
+            break
+    while None in fields:
+        fields[fields.index(None)] = ''
+    return ','.join(map(str, fields))
 
 
 def check_id_nss(ugid):