def _do_login_user(user, next, remember_me=False): # Check if user account has been disabled if not _call_or_get(user.is_active): return ajax_response(message='Ваша електронна адреса не була підтверджена.' 'Перевірте вашу електронну скриньку на наявність листа.' 'У цьому листі натисніть підтвердити електронну адресу. ' 'Якщо лист не прийшов перейдіть за ' '<a href="%s">цим</a> посиланням.' % url_for('user.resend_confirm_email')) # Check if user has a confirmed email address user_manager = current_app.user_manager if user_manager.enable_email and user_manager.enable_confirm_email \ and not current_app.user_manager.enable_login_without_confirm_email \ and not user.has_confirmed_email(): url = url_for('user.resend_confirm_email') return ajax_response(message='Ваша електронна адреса не була підтверджена.' 'Перевірте вашу електронну скриньку на наявність листа.' 'У цьому листі натисніть підтвердити електронну адресу. ' 'Якщо лист не прийшов перейдіть за ' '<a href="%s">цим</a> посиланням.' % url_for('user.resend_confirm_email')) # Use Flask-Login to sign in user #print('login_user: remember_me=', remember_me) login_user(user, remember=remember_me) # Send user_logged_in signal signals.user_logged_in.send(current_app._get_current_object(), user=user) # # Prepare one-time system message # flash(_('You have signed in successfully.'), 'success') # # # Redirect to 'next' URL print(next) return
def login(): """ Prompt for username/email and password and sign the user in.""" user_manager = current_app.user_manager db_adapter = user_manager.db_adapter data = request.form next = request.args.get('next', _endpoint_url(user_manager.after_login_endpoint)) reg_next = request.args.get('reg_next', _endpoint_url(user_manager.after_register_endpoint)) # Immediately redirect already logged in users if _call_or_get(current_user.is_authenticated) and user_manager.auto_login_at_login: return redirect(next) user = None user_email = None # user = user_manager.find_user_by_username(data.get('user_name')) user = db_query(User).filter(or_(User.email == data.get('user_name'), User.username == data.get('user_name'))).first() if not user: return ajax_response(message="Ви ввели невірний логін або пароль") else: if user.password: if not verify_password(user_manager, data.get('password'), user.password): user = None return ajax_response(message="Ви ввели невірний логін або пароль") else: return ajax_response(message="Ви ввели невірний логін або пароль") user_email = None session['login_via'] = request.host remember_me = True if data.get('remember_me') else False if user and db_adapter.UserEmailClass: user_email = db_adapter.find_first_object(db_adapter.UserEmailClass, user_id=int(user.get_id()), is_primary=True, ) if not user and user_manager.enable_email: user, user_email = user_manager.find_user_by_email(data.get('user_name')) if user: _do_login_user(user, request.referrer, remember_me=remember_me) return ajax_response(message="Ви були успішно залоговані", reload_page = True)
def register(): """ Display registration form and create new User.""" user_manager = current_app.user_manager db_adapter = user_manager.db_adapter # info = Info(username=request.form.get('username'), email=request.form.get('email'), # password=request.form.get('password')) # info.save() # next = request.args.get('next', _endpoint_url(user_manager.after_login_endpoint)) reg_next = request.args.get('reg_next', _endpoint_url(user_manager.after_register_endpoint)) # invite token used to determine validity of registeree invite_token = request.values.get("token") # require invite without a token should disallow the user from registering # if user_manager.require_invitation and not invite_token: # flash("Registration is invite only", "error") # return redirect(url_for('user.login')) user_invite = None # if invite_token and db_adapter.UserInvitationClass: # user_invite = db_adapter.find_first_object(db_adapter.UserInvitationClass, token=invite_token) if request.method == 'POST': # Create a User object using Form fields that have a corresponding User field User = db_adapter.UserClass user_class_fields = User.__dict__ user_fields = {} # Create a UserEmail object using Form fields that have a corresponding UserEmail field if db_adapter.UserEmailClass: UserEmail = db_adapter.UserEmailClass user_email_class_fields = UserEmail.__dict__ user_email_fields = {} # Create a UserAuth object using Form fields that have a corresponding UserAuth field if db_adapter.UserAuthClass: UserAuth = db_adapter.UserAuthClass user_auth_class_fields = UserAuth.__dict__ user_auth_fields = {} # Enable user account if db_adapter.UserProfileClass: if hasattr(db_adapter.UserProfileClass, 'active'): user_auth_fields['active'] = True elif hasattr(db_adapter.UserProfileClass, 'is_enabled'): user_auth_fields['is_enabled'] = True else: user_auth_fields['is_active'] = True else: if hasattr(db_adapter.UserClass, 'active'): user_fields['active'] = True elif hasattr(db_adapter.UserClass, 'is_enabled'): user_fields['is_enabled'] = True else: user_fields['is_active'] = True data = request.form # For all form fields print(request.args) user_fields['registered_via'] = 'api-tvprogram.rhcloud.com' for field_name, field_value in data.items(): # Hash password field if field_name == 'password': if len(field_value) < 7: return ajax_response(message='Пароль повинен містити не менше семи символів') hashed_password = user_manager.hash_password(field_value) if db_adapter.UserAuthClass: user_auth_fields['password'] = hashed_password else: user_fields['password'] = hashed_password # Store corresponding Form fields into the User object and/or UserProfile object else: if field_name in user_class_fields: user_fields[field_name] = field_value if db_adapter.UserEmailClass: if field_name in user_email_class_fields: user_email_fields[field_name] = field_value if db_adapter.UserAuthClass: if field_name in user_auth_class_fields: user_auth_fields[field_name] = field_value # Add User record using named arguments 'user_fields' user = db_adapter.add_object(User, **user_fields) if db_adapter.UserProfileClass: user_profile = user # Add UserEmail record using named arguments 'user_email_fields' if db_adapter.UserEmailClass: user_email = db_adapter.add_object(UserEmail, user=user, is_primary=True, **user_email_fields) else: user_email = None # Add UserAuth record using named arguments 'user_auth_fields' if db_adapter.UserAuthClass: user_auth = db_adapter.add_object(UserAuth, **user_auth_fields) if db_adapter.UserProfileClass: user = user_auth else: user.user_auth = user_auth require_email_confirmation = True if user_invite: if user_invite.email == data.get('email'): require_email_confirmation = False db_adapter.update_object(user, confirmed_at=datetime.datetime.utcnow()) try: db_adapter.commit() except IntegrityError as e: if e.message.find('email') != -1: return ajax_response(message='Така електронна адреса вже зареєстрована на нашому сайті') elif e.message.find('username') != -1: return ajax_response(message='Юзер з таким ніком вже зареєстрований на нашому сайті.' 'Виберіть інший нік') # Send 'registered' email and delete new User object if send fails if user_manager.send_registered_email: try: # Send 'registered' email _send_registered_email(user, user_email, require_email_confirmation) except Exception as e: # delete new User object if send fails db_adapter.delete_object(user) db_adapter.commit() raise # Send user_registered signal signals.user_registered.send(current_app._get_current_object(), user=user, user_invite=user_invite) # Redirect if USER_ENABLE_CONFIRM_EMAIL is set if user_manager.enable_confirm_email and require_email_confirmation: next = request.args.get('next', _endpoint_url(user_manager.after_register_endpoint)) return ajax_response(message='На вашу електронну адресу був відправленний лист з підтвердженням реєстрації.' 'Перейдіть на вашу поштову скриньку, щоб завершити реєстрацію на нашому ' 'сайті.<h5><a href="{mail_url}" target="_blank">Перейти</a></h5>"Якщо лист не прийшов ' 'перейдіть за <a href="{resend_email}">цим</a> посиланням і ми ' 'відправимо лист ще раз'.format( mail_url='http://'+data.get('email').split('@')[-1]+'/mail', resend_email=url_for('user.resend_confirm_email')), alert='На вашу електронну адресу був відправленний лист з підтвердженням реєстрації.' 'Перейдіть на вашу поштову скриньку, щоб завершити реєстрацію на нашому сайті.') # Auto-login after register or redirect to login page next = request.args.get('next', _endpoint_url(user_manager.after_confirm_endpoint)) if user_manager.auto_login_after_register: return _do_login_user(user, reg_next) # auto-login else: return ajax_response(message='На вашу електронну адресу був відправленний лист з підтвердженням реєстрації.' 'Перейдіть на вашу поштову скриньку, щоб завершити реєстрацію на нашому ' 'сайті.<h5><a href="{mail_url}">Перейти</a></h5>"Якщо лист не прийшов ' 'перейдіть за <a href="{resend_email}" target="_blank">цим</a> посиланням і ми ' 'відправимо лист ще раз'.format( mail_url='http://'+data.get('email').split('@')[-1]+'/mail', resend_email=url_for('user.resend_confirm_email')), alert='На вашу електронну адресу був відправленний лист з підтвердженням реєстрації.' 'Перейдіть на вашу поштову скриньку, щоб завершити реєстрацію на нашому сайті') # Process GET or invalid POST return redirect(request.referrer)