Merge branch 'onelab' of ssh://git.onelab.eu/git/myslice into fibre
[myslice.git] / portal / actions.py
index d62f994..b399ca2 100644 (file)
@@ -118,7 +118,7 @@ def manifold_add_user(wsgi_request, request):
     USER_CONFIG = '{"firstname": "%(first_name)s", "lastname": "%(last_name)s", "authority": "%(authority_hrn)s"}'
 
     user_params = {
-        'email'     : request['email'],
+        'email'     : request['username'],
         'password'  : request['password'],
         'config'    : USER_CONFIG % request,
         'status'    : 1,
@@ -283,6 +283,10 @@ def portal_validate_request(wsgi_request, request_ids):
         if request['type'] == 'user':
 
             try:
+                split_email = request['email'].split("@")[0] 
+                split_email = split_email.replace(".", "_")
+                split_authority = request['authority_hrn'].split(".")[1]
+                request['username'] = split_email + '@' + split_authority
                 create_user(wsgi_request, request)
                 request_status['SFA user'] = {'status': True }
                 PendingUser.objects.get(id=request['id']).delete()
@@ -450,7 +454,7 @@ def manifold_add_reference_user_accounts(wsgi_request, request):
     # Retrieve user information
     user_query  = Query().get('local:user')             \
         .select('user_id', 'config', 'email', 'status') \
-        .filter_by('email', '==', request['email'])
+        .filter_by('email', '==', request['username'])
     user_details = execute_admin_query(wsgi_request, user_query)
 
     # USER MAIN ACCOUNT != reference
@@ -521,6 +525,138 @@ def sfa_create_user(wsgi_request, request):
         send_mail(subject, msg, 'support@onelab.eu',[request['email']], fail_silently=False)       
     return results
 
+def ldap_create_user(wsgi_request, request, user_detail):
+    """
+    Populating LDAP withuser data - Edelberto 10/03/2014
+    """
+    # import needed modules
+    import ldap
+    import ldap.modlist as modlist
+
+    # Open a connection
+    # XXX We need to create this in settings
+    # ldap.open is deprecated!
+    #l = ldap.open("127.0.0.1")
+    l = ldap.initialize('ldap://127.0.0.1:389')
+
+    # you should  set this to ldap.VERSION2 if you're using a v2 directory
+    l.protocol_version = ldap.VERSION3
+
+    # Bind/authenticate with a user with apropriate rights to add objects
+    # XXX Now we set the force rootd but after we need to set this in settings file for could change the dn and password of root
+    l.simple_bind_s("cn=Manager,dc=br","fibre")
+
+    # The dn of our new entry/object
+    #dn="uid=addtest@uff.br,ou=people,o=uff,dc=br"
+
+    # we need to create the dn entry
+    # Receiving an email address, how can we split and mount it in DN format?
+    #mail = "debora@uff.br"
+    mail = request['email']
+    login = mail.split('@')[0]
+    org = mail.split('@')[1]
+    o = org.split('.')[-2]
+    dc = org.split('.')[-1]
+
+    # DN format to authenticate - IMPORTANT!
+    #FIBRE-BR format
+    dn = "uid="+mail+",ou=people,o="+o+",dc="+dc
+
+    # DEBUG
+    print "dn:"+dn
+    print request['password']
+
+    # Creating a unique uidNumber - Necessary for experiments
+    # Was defined to began in 100000
+    unique = int(user_detail['user_id']) + 100000
+    #unique = int(unique)
+    print unique
+
+    # A dict to help build the "body" of the object
+    attrs = {}
+    attrs['objectclass'] = ['person','inetOrgPerson','posixAccount','eduPerson','brPerson','schacPersonalCharacteristics','fibre', 'ldapPublicKey']
+    # XXX Converting all unicodes to string
+    attrs['uid'] = mail.encode('utf-8')
+    attrs['cn'] = request['first_name'].encode('latin1')
+    attrs['sn'] = request['last_name'].encode('latin1')
+    # XXX we need to set a unique uidNumber. How?
+    attrs['uidNumber'] = str(unique)
+    attrs['gidNumber'] = '500'
+    attrs['homeDirectory'] = "/home/"+org+"/"+mail
+    attrs['homeDirectory'] = attrs['homeDirectory'].encode('utf-8')
+    attrs['mail'] = mail.encode('utf-8')
+    attrs['eppn'] = mail.encode('utf8')
+    attrs['userPassword'] = request['password'].encode('utf-8')
+    attrs['sshPublicKey'] = request['public_key'].encode('utf-8')
+    # XXX We really set TRUE for those attributes? 
+    #attrs['userEnable'] = 'TRUE'
+    # set FALSE and change after when the user is validated
+    attrs['userEnable'] = 'FALSE'
+    attrs['omfAdmin'] = 'TRUE'
+
+    # Convert our dict to nice syntax for the add-function using modlist-module
+    ldif = modlist.addModlist(attrs)
+
+    # DEBUG
+    print attrs['userPassword']
+    print attrs['cn']
+    print attrs['sn']
+    print attrs['homeDirectory']
+    #print ldif
+
+    # Do the actual synchronous add-operation to the ldapserver
+    l.add_s(dn,ldif)
+
+    # Its nice to the server to disconnect and free resources when done
+    l.unbind_s()
+
+    return ldif
+
+def ldap_modify_user(wsgi_request, request):
+    #Modify entries in an LDAP Directory
+
+    #Synchrounous modify
+    # import needed modules
+    import ldap
+    import ldap.modlist as modlist
+
+    # Open a connection
+    l = ldap.initialize("ldap://localhost:389/")
+
+    # Bind/authenticate with a user with apropriate rights to add objects
+    l.simple_bind_s("cn=Manager,dc=br","fibre")
+
+    # we need to create the dn entry
+    # Receiving an email address, how can we split and mount it in DN format?
+    #mail = "debora@uff.br"
+    mail = request['email']
+    login = mail.split('@')[0]
+    org = mail.split('@')[1]
+    o = org.split('.')[-2]
+    dc = org.split('.')[-1]
+
+    # DN format to authenticate - IMPORTANT!
+    #FIBRE-BR format
+    dn = "uid="+mail+",ou=people,o="+o+",dc="+dc
+
+    # The dn of our existing entry/object
+    #dn="uid=mario@uff.br,ou=people,o=uff,dc=br"
+
+    # Some place-holders for old and new values
+    old = {'userEnable':'FALSE'}
+    new = {'userEnable':'TRUE'}
+
+    # Convert place-holders for modify-operation using modlist-module
+    ldif = modlist.modifyModlist(old,new)
+
+    # Do the actual modification
+    l.modify_s(dn,ldif)
+
+    # Its nice to the server to disconnect and free resources when done
+    l.unbind_s()
+
+    return ldif
+
 def create_user(wsgi_request, request):
     
     # XXX This has to be stored centrally
@@ -528,16 +664,34 @@ def create_user(wsgi_request, request):
 
     # NOTE : if we were to create a user directly (just like we create slices,
     # we would have to perform the steps in create_pending_user too
-
+    
+    # Edelberto - I put this more below
     # Add the user to the SFA registry
-    sfa_create_user(wsgi_request, request)
+    #sfa_create_user(wsgi_request, request)
 
     # Update Manifold user status
-    manifold_update_user(wsgi_request, request['email'], {'status': USER_STATUS_ENABLED})
+    manifold_update_user(wsgi_request, request['username'], {'status': USER_STATUS_ENABLED})
 
     # Add reference accounts for platforms
     manifold_add_reference_user_accounts(wsgi_request, request)
+    
+# Add the user to the SFA registry
+    sfa_create_user(wsgi_request, request)
 
+    '''   
+    # LDAP update user userEnabled = True
+    try:
+        mail = request['email']
+        login = mail.split('@')[0]
+        org = mail.split('@')[1]
+        o = org.split('.')[-2]
+        dc = org.split('.')[-1]
+        # To know if user is a LDAP user - Need to has a 'dc' identifier
+        if dc == 'br' or 'eu':
+            ldap_modify_user(wsgi_request, request)
+    except Exception, e:
+        "LDAP create user failed"
+    '''
 def create_pending_user(wsgi_request, request, user_detail):
     """
     """
@@ -557,6 +711,12 @@ def create_pending_user(wsgi_request, request, user_detail):
         status        = 'False',
     )
     b.save()
+
+    split_email = request['email'].split("@")[0] 
+    split_email = split_email.replace(".", "_")
+    split_authority = request['authority_hrn'].split(".")[1]
+    request['username'] = split_email + '@' + split_authority
+
     # sends email to user to activate the email
     theme.template_name = 'activate_user.html'
     html_content = render_to_string(theme.template, request)
@@ -577,7 +737,7 @@ def create_pending_user(wsgi_request, request, user_detail):
     msg.send()
    
     # saves the user to django auth_user table [needed for password reset]
-    user = User.objects.create_user(request['email'], request['email'], request['password'])
+    user = User.objects.create_user(request['username'], request['email'], request['password'])
 
     # Creating a manifold user
     user_id = manifold_add_user(wsgi_request, request)
@@ -603,7 +763,6 @@ def create_pending_user(wsgi_request, request, user_detail):
             .filter_by('platform', '==', 'myslice')           \
             .select('platform_id')
         reg_platform = execute_admin_query(wsgi_request, reg_platform_query)
-
         reg_platform_id = reg_platform[0]['platform_id']
         account_params = {
             'platform_id'   : reg_platform_id, # XXX ALERT !!
@@ -613,7 +772,11 @@ def create_pending_user(wsgi_request, request, user_detail):
         }
         manifold_add_account(wsgi_request, account_params)
     except Exception, e:
-        print "Failed creating manifold account on platform %s for user: %s" % ('myslice', request['email'])
+       print "Failed creating manifold account on platform %s for user: %s" % ('myslice', request['email'])
+
+    # Add user to LDAP userEnabled = False
+    # Not more here. Create before directly to the registrationview.py
+    # After we change userEnable = TRUE when validate the user
 
     try:
         # Send an email: the recipients are the PI of the authority