# this somehow is not used anymore - should it not be ? from django.core.context_processors import csrf from django.http import HttpResponseRedirect from django.contrib.auth import authenticate, login, logout, get_user_model from django.template import RequestContext from django.shortcuts import render_to_response from django.shortcuts import render import json from unfold.loginrequired import FreeAccessView from manifold.core.query import Query #from manifoldapi.manifoldapi import execute_query # LDAP query admin // If transfer this code to actions.py maybe don't need more execute_admin_query from manifoldapi.manifoldapi import execute_query, execute_admin_query # Edelberto - LDAP XXX from portal.models import PendingUser from django.contrib.auth.models import User #Pedro from portal.actions import create_pending_user, create_user, create_user_in_ldap, clear_user_creds from registrationview import RegistrationView from random import randint from hashlib import md5 from django.contrib.sites.models import Site import os.path, re ################## from manifoldapi.manifoldresult import ManifoldResult from ui.topmenu import topmenu_items, the_user from myslice.configengine import ConfigEngine from myslice.theme import ThemeView # Edelberto LDAP authentication XXX import ldap #import activity.user class HomeView (FreeAccessView, ThemeView): template_name = 'home-view.html' # expose this so we can mention the backend URL on the welcome page def default_env (self): return { 'MANIFOLD_URL':ConfigEngine().manifold_url(), } def post (self,request): env = self.default_env() env['theme'] = self.theme env['section'] = "Dashboard" username = request.POST.get('username').lower() password = request.POST.get('password') # LDAP form - If FIBRE, then get the possibilite to authenticate using usernameldap #if self.theme == 'fibre': #usernameldap = request.POST.get('usernameldap') #token = {'usernameldap': usernameldap, 'username': username ,'password': password, 'request': request} ################################################## ########## XXX Edelberto 010914 XXX ################################################# ## first you must open a connection to the server try: # Connect to UFRJ l = ldap.initialize("ldap://200.130.15.186:389") # Bind/authenticate with a root user to search all objects l.simple_bind_s("cn=Manager,dc=br,dc=fibre","fibre2013") l.protocol_version = ldap.VERSION3 except ldap.LDAPError, e: print e ## Base directory baseDN = "dc=fibre" searchScope = ldap.SCOPE_SUBTREE ## retrieve all attributes retrieveAttributes = None #retrieveAttributes = ['userEnable'] searchFilter = "uid=" + username print searchFilter in_ldap = 0 try: if username != "admin": ldap_result_id = l.search(baseDN, searchScope, searchFilter, retrieveAttributes) result_set = [] result_type, result_data = l.result(ldap_result_id, 0) if (result_data == []): print "User doesnt exist in LDAP" in_ldap = 0 else: if result_type == ldap.RES_SEARCH_ENTRY: result_set.append(result_data) else: result_set.append(result_data) # TRUE or FALSE for userEnable attribute userEnable = result_set[0][0][1]['userEnable'][0] if userEnable == 'TRUE': in_ldap = 1 enabled = 1 print "In LDAP and Enabled" dn = result_set[0][0][0] try: l.simple_bind_s(dn,password) pwd = 1 print "User password OK" except: pwd = 0 print "User password WRONG" if in_ldap and enabled and pwd: ldap_mail = result_set[0][0][1]['mail'][0] user_exists = Query().get('local:user') \ .select('status') \ .filter_by('email', '==', username) results = execute_admin_query(request, user_exists) print "DEBUG: %s" % user_exists if results: print "DEBUG: user exists on MySlice DBs" else: print "DEBUG: user NOT exists on MySlice DBs" cn = result_set[0][0][1]['cn'][0] sn = result_set[0][0][1]['sn'][0] fname=None lname=None try: fname = sn.split(' ')[0] lname = sn.split(' ')[1] except: fname = sn lname = "" #authority_hrn = 'fibre' + '.' + username.split('@')[1] authority_hrn = 'fibre' print authority_hrn email = ldap_mail print ldap_mail username = username print username password = password print password # user_hrn = 'fibre' + '.' + username.split('@')[1] + '.' + username user_hrn = 'fibre' + '.' + username print user_hrn # Based on registrationview # get the domain url current_site = Site.objects.get_current() current_site = current_site.domain print current_site post_email = ldap_mail salt = randint(1,100000) email_hash = md5(str(salt)+post_email).hexdigest() print email_hash user_request = { 'first_name' : fname, 'last_name' : lname, 'organization' : authority_hrn, 'authority_hrn' : authority_hrn, 'email' : ldap_mail, 'username' : username, 'password' : password, 'current_site' : current_site, 'email_hash' : email_hash, 'pi' : '', 'user_hrn' : user_hrn, 'reasons' : 'already exists in the LDAP', 'type' : 'user', 'validation_link': 'https://' + current_site + '/portal/email_activation/'+ email_hash } # Validate input errors = [] UserModel = get_user_model() if (re.search(r'^[\w+\s.@+-]+$', user_request['first_name']) == None): errors.append('First name may contain only letters, numbers, spaces and @/./+/-/_ characters.') if (re.search(r'^[\w+\s.@+-]+$', user_request['last_name']) == None): errors.append('Last name may contain only letters, numbers, spaces and @/./+/-/_ characters.') if (re.search(r'^[\w,]+$' , username) == None): errors.append('Username may contain only letters,numbers and -/_ characters.') # checking in django_db !! if PendingUser.objects.filter(email__iexact = user_request['email']): errors.append('Email is pending for validation. Please provide a new email address.') if User.objects.filter(username__iexact = user_request['username']): errors.append('This username is already in use, try another one') # Does the user exist in Manifold? user_query = Query().get('local:user').select('user_id','email') user_details = execute_admin_query(request, user_query) for user_detail in user_details: if user_detail['email'] == user_request['email']: errors.append('Email already registered in Manifold. Please provide a new email address.') # Does the user exist in sfa? [query is very slow!!] #user_query = Query().get('user').select('user_hrn','user_email') # XXX Test based on the user_hrn is quick #user_query = Query().get('user').select('user_hrn','user_email').filter_by('user_hrn','==',user_request['user_hrn']) user_query = Query().get('user').select('user_hrn','user_email').filter_by('user_hrn','==',user_hrn) user_details_sfa = execute_admin_query(request, user_query) #if 'generate' in wsgi_request.POST['question']: user_request['auth_type'] = 'managed' # XXX Common code, dependency ? from Crypto.PublicKey import RSA private = RSA.generate(1024) # Example: private_key = '-----BEGIN RSA PRIVATE KEY-----\nMIIC...' # Example: public_key = 'ssh-rsa AAAAB3...' user_request['private_key'] = private.exportKey() user_request['public_key'] = private.publickey().exportKey(format='OpenSSH') # XXX Verify if errors exist - After! #if not errors: create_user_in_ldap(request, user_request, user_detail) #create_pending_user(request, user_request, user_detail) #create_user(request, user_request) env['state'] = "LDAP associated. Please, login again." return render_to_response(self.template, env, context_instance=RequestContext(request)) else: env['state'] = "Access denied. Verify LDAP userEnable and password." return render_to_response(self.template, env, context_instance=RequestContext(request)) else: in_ldap = 1 enabled = 0 print "In LDAP but Disabled" env['state'] = "Access denied. Verify LDAP userEnable." return render_to_response(self.template, env, context_instance=RequestContext(request)) #print result_set except ldap.LDAPError, e: print e #else: if in_ldap and enabled and pwd or username=="admin": ################################################################################ ### XXX Edelberto LDAP auth end XXX ############################################################################### # Follow original code ## pass request within the token, so manifold session key can be attached to the request session. token = {'username': username, 'password': password, 'request': request} # our authenticate function returns either # . a ManifoldResult - when something has gone wrong, like e.g. backend is unreachable # . a django User in case of success # . or None if the backend could be reached but the authentication failed auth_result = authenticate(token=token) # use one or two columns for the layout - not logged in users will see the login prompt # high-level errors, like connection refused or the like if isinstance (auth_result, ManifoldResult): manifoldresult = auth_result # let's use ManifoldResult.__repr__ env['state']="%s"%manifoldresult return render_to_response(self.template,env, context_instance=RequestContext(request)) # user was authenticated at the backend elif auth_result is not None: user=auth_result if user.is_active: print "LOGGING IN" login(request, user) if request.user.is_authenticated(): env['person'] = self.request.user env['username'] = self.request.user ## check user is pi or not platform_query = Query().get('local:platform').select('platform_id','platform','gateway_type','disabled') account_query = Query().get('local:account').select('user_id','platform_id','auth_type','config') # Edleberto #cc_auth_cred = {} platform_details = execute_query(self.request, platform_query) account_details = execute_query(self.request, account_query) for platform_detail in platform_details: for account_detail in account_details: if platform_detail['platform_id'] == account_detail['platform_id']: if 'config' in account_detail and account_detail['config'] is not '': account_config = json.loads(account_detail['config']) if 'myslice' in platform_detail['platform']: acc_auth_cred = account_config.get('delegated_authority_credentials','N/A') # assigning values if acc_auth_cred=={} or acc_auth_cred=='N/A': pi = "is_not_pi" else: pi = "is_pi" env['pi'] = pi else: env['person'] = None return render_to_response(self.template,env, context_instance=RequestContext(request)) else: env['state'] = "Your account is not active, please contact the site admin." env['layout_1_or_2']="layout-unfold2.html" return render_to_response(self.template,env, context_instance=RequestContext(request)) # otherwise else: # log user activity #activity.user.login(self.request, "error") env['state'] = "Your username and/or password were incorrect." return render_to_response(self.template, env, context_instance=RequestContext(request)) def get (self, request, state=None): env = self.default_env() acc_auth_cred={} if request.user.is_authenticated(): ## check user is pi or not platform_details = {} account_details = {} acc_auth_cred = {} acc_user_cred = {} platform_query = Query().get('local:platform').select('platform_id','platform','gateway_type','disabled') account_query = Query().get('local:account').select('user_id','platform_id','auth_type','config') # XXX Something like an invalid session seems to make the execute fail sometimes, and thus gives an error on the main page platform_details = execute_query(self.request, platform_query) account_details = execute_query(self.request, account_query) if platform_details is not None and platform_details != {}: for platform_detail in platform_details: for account_detail in account_details: if 'platform_id' in platform_detail: if platform_detail['platform_id'] == account_detail['platform_id']: if 'config' in account_detail and account_detail['config'] is not '': account_config = json.loads(account_detail['config']) if 'myslice' in platform_detail['platform']: acc_auth_cred = account_config.get('delegated_authority_credentials','N/A') acc_user_cred = account_config.get('delegated_user_credential','N/A') # assigning values if acc_auth_cred=={} or acc_auth_cred=='N/A': pi = "is_not_pi" else: pi = "is_pi" # check if the user has creds or not if acc_user_cred == {} or acc_user_cred == 'N/A': user_cred = 'no_creds' else: user_cred = 'has_creds' env['pi'] = pi env['user_cred'] = user_cred env['person'] = self.request.user else: env['person'] = None env['theme'] = self.theme env['section'] = "Dashboard" env['username']=the_user(request) env['topmenu_items'] = topmenu_items(None, request) if state: env['state'] = state elif not env['username']: env['state'] = None # use one or two columns for the layout - not logged in users will see the login prompt # account_query = Query().get('local:account').select('user_id','platform_id','auth_type','config') # account_details = execute_query(self.request, account_query) # for account_detail in account_details: # account_config = json.loads(account_detail['config']) # platform_name = platform_detail['platform'] # if 'myslice' in platform_detail['platform']: # acc_user_cred = account_config.get('delegated_user_credential','N/A') # acc_slice_cred = account_config.get('delegated_slice_credentials','N/A') # acc_auth_cred = account_config.get('delegated_authority_credentials','N/A') # # if 'N/A' not in acc_user_cred: # exp_date = re.search('(.*)', acc_user_cred) # if exp_date: # user_exp_date = exp_date.group(1) # user_cred_exp_list.append(user_exp_date) # # my_users = [{'cred_exp': t[0]} # for t in zip(user_cred_exp_list)] # # # if 'N/A' not in acc_slice_cred: # for key, value in acc_slice_cred.iteritems(): # slice_list.append(key) # # get cred_exp date # exp_date = re.search('(.*)', value) # if exp_date: # exp_date = exp_date.group(1) # slice_cred_exp_list.append(exp_date) # # my_slices = [{'slice_name': t[0], 'cred_exp': t[1]} # for t in zip(slice_list, slice_cred_exp_list)] # # if 'N/A' not in acc_auth_cred: # for key, value in acc_auth_cred.iteritems(): # auth_list.append(key) # #get cred_exp date # exp_date = re.search('(.*)', value) # if exp_date: # exp_date = exp_date.group(1) # auth_cred_exp_list.append(exp_date) return render_to_response(self.template, env, context_instance=RequestContext(request))