-
- print "############ BREAKPOINT 5 #################"
-
- # Construct user_hrn from email (XXX Should use common code)
- split_email = user_request['email'].split("@")[0]
- split_email = split_email.replace(".", "_")
- # Replace + by _ => more convenient for testing and validate with a real email
- split_email = split_email.replace("+", "_")
- user_request['user_hrn'] = user_request['authority_hrn'] \
- + '.' + split_email
-
- # Validate input
- 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.')
- # Does the user exist in Manifold?
- user_query = Query().get('local:user').select('user_id','email')
- user_details = execute_admin_query(wsgi_request, user_query)
- for user_detail in user_details:
- if user_detail['email'] == user_request['email']:
- errors.append('Email already registered. <a href="/">Login</a> with your existing account. <a href="/portal/pass_reset/">Forgot your password?</a>')
-
- # 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
-
- # REGISTRY ONLY TO BE REMOVED WITH MANIFOLD-V2
- user_query = Query().get('myslice:user').select('user_hrn','user_email').filter_by('user_hrn','==',user_request['user_hrn'])
- user_details_sfa = execute_admin_query(wsgi_request, user_query)
-
- for user in user_details_sfa:
- if user['user_email'] == user_request['email']:
- errors.append('Email already registered in OneLab registry. <a href="/contact">Contact OneLab support</a> or use another email.')
- if user['user_hrn'] == user_request['user_hrn']:
- # add random number if user_hrn already exists in the registry
- user_request['user_hrn'] = user_request['authority_hrn'] \
- + '.' + split_email + str(randint(1,1000000))
-
- # checking in django unfold db portal application pending users
- # sqlite3 /var/unfold/unfold.sqlite3
- # select email from portal_pendinguser;
- if PendingUser.objects.filter(email__iexact = user_request['email']):
- errors.append('Account pending for validation. Please wait till your account is validated or contact OneLab support.')
-
- # checking in django_db !!
- # sqlite3 /var/unfold/unfold.sqlite3
- # select email from auth_user;
- if UserModel._default_manager.filter(email__iexact = user_request['email']):
- errors.append('<a href="/contact">Contact OneLab support</a> or try with another email.')
-
- # XXX TODO: Factorize with portal/accountview.py
- # XXX TODO: Factorize with portal/registrationview.py
- # XXX TODO: Factorize with portal/joinview.py
- 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')
-
- else:
- user_request['auth_type'] = 'user'
-
- up_file = wsgi_request.FILES['user_public_key']
-
- file_content = up_file.read().strip()
- file_name = up_file.name
- file_extension = os.path.splitext(file_name)[1]
-
- ALLOWED_EXTENSIONS = ['.pub','.txt']
- if file_extension not in ALLOWED_EXTENSIONS or not re.search(r'ssh-rsa',file_content):
- errors.append('Please upload a valid RSA public key.')
- # user_request['private_key'] can't be Null because all db fields are set as NOT NULL
- user_request['private_key'] = ""
- user_request['public_key'] = file_content