def handle(self, request, data): email = data.get("email") try: res = keystoneapi.get_user(email) if not (res.get("success") or res.get("result")): return None user = res.get("result") user_id = user.get('id') email_activation_code = generate_sms_activation_code() data = {"email_activation_code": email_activation_code, "email_activation_code_time": timeutils.strtime()} # email confirmation about the change send_templated_email("JioCloud account password change confirmation", [email], html_template="signup/password_change_verification.html", template_context={ "name": user.get("first_name") if user.get("first_name") else user.get("name"), "reset_password_path": reverse_lazy('horizon_jiocloud:resetPassword', kwargs={'user_id':user_id, 'code':email_activation_code}), "SITE_URL": getattr(settings, "SITE_URL", "http://127.0.0.1"), }) # push changes to keystone database response = keystoneapi.update_user(user_id, data) except Exception as e: LOG.exception(e) return render_to_response('signup/forgot_password_success.html', {'email':settings.DEFAULT_FROM_EMAIL, 'user_id': user_id})
def handle(self, request, data): data.pop('confirm_password') user_id = data.pop('user_id') code = data.pop('code') try: res = keystoneapi.get_user(user_id) if not (res.get("success") or res.get("result")): return None except Exception as e: LOG.exception(e) return None user = res.get("result") # check if the code submitted in the form and that in the # database match email_activation_code = user.get("email_activation_code") if email_activation_code not in [code]: self.set_non_field_errors(["Invalid Activation Code"]) return None # codes matched. so we will change the password # in database. # email_activation_code no more required so unset it # in database. data["email_activation_code"] = "" try: res = keystoneapi.update_user(user_id, data) except Exception as e: LOG.exception(e) return render_to_response('signup/reset_password_success.html')
def activate(request, activation_code): new_email = request.GET.get('email', '') try: res = keystoneapi.get_user(request.user.id) if not (res.get("success") or res.get("result")): raise Exception() except Exception as ex: LOG.exception(ex) return render_to_response('change_email/email_change_failure.html') user = res.get("result") email_activation_code = user.get("email_activation_code") email_activation_code_time = user.get("email_activation_code_time") if not new_email or email_activation_code != activation_code or is_sms_expired(email_activation_code_time): return render_to_response('change_email/email_change_failure.html') # codes matched. so we will change the email in database try: # push changes to keystone database if user.get("name") == user.get("email"): response = keystoneapi.update_user(request.user.id, {"name" : new_email, "email" : new_email}) else: response = keystoneapi.update_user(request.user.id, {"email" : new_email}) except Exception as ex: LOG.exception(ex) return render_to_response('change_email/email_change_failure.html') return render_to_response('change_email/email_change_success.html')
def resendSms(request, user_id): url = reverse_lazy('horizon_jiocloud:user_sms_activation', kwargs={'user_id':user_id}) # This method serves re-sending SMS multiple times # to cater to SMS sending failures. # If the OTP is expired, a new one will be generated try: res = keystoneapi.get_user(user_id) if not (res.get("success") or res.get("result")): raise Exception('Unable to get user details') except Exception as e: LOG.exception(e) return http.HttpResponseRedirect(url + "?resentSms=True&resentSuccess=False") user = res.get("result") phone = user.get("phone") sms_activation_code = user.get("sms_activation_code") sms_activation_code_time = user.get("sms_activation_code_time") try: if is_sms_expired(sms_activation_code_time): sms_activation_code = generate_sms_activation_code() data = {"sms_activation_code": sms_activation_code, "sms_activation_code_time": timeutils.strtime()} # push changes to keystone database response = keystoneapi.update_user(user_id, data) generate_and_send_sms(phone, sms_activation_code) except Exception as e: LOG.exception(e) return http.HttpResponseRedirect(url + "?resentSms=True&resentSuccess=False") return http.HttpResponseRedirect(url + "?resentSms=True&resentSuccess=True")
def __init__(self, request, *args, **kwargs): super(PhoneForm, self).__init__(request, *args, **kwargs) res = {} self.user = None self.sms_expired = True request.session["show_sms_button"] = None try: # erro handling: when the user details could not be fetched, # show the default error message try: res = keystoneapi.get_user(self.request.user.id) except Exception as ex: LOG.exception(ex) self.set_non_field_errors([self.get_default_error_message()]) del self.fields["sms_activation_code"] return None if not (res.get("success") or res.get("result")): del self.fields["sms_activation_code"] return None self.user = res.get("result") if not kwargs["initial"]["phone"]: # we populate the initial value from request.session in views.py # No intial value implies that the user hasn't yet started the # phone number change process and hasn't keyed-in the new phone # number. So, pre-fill the field with the current phone number # from database kwargs["initial"]["phone"] = self.user.get("phone") sms_activation_code = self.user.get("sms_activation_code") sms_activation_code_time = \ self.user.get("sms_activation_code_time") self.sms_expired = is_sms_expired(sms_activation_code_time) if (not (sms_activation_code and sms_activation_code_time)) or \ self.sms_expired: # empty sms_activation_code => the user hasn't yet started the # phone number change process. # sms_expired => the user has to generate a new OTP. # In either case, remove the sms_activation_code field from form del self.fields["sms_activation_code"] return None else: # the user is in the middle of phone number change. # In some cases, SMS may not have been delivered. # So, set this flag to true. Based on this flag, 'Resend SMS' # button will be displayed in UI. Logic to this effect is # implemented in the template request.session["show_sms_button"] = True except Exception as ex: import traceback traceback.print_exc() LOG.exception(ex) self.set_non_field_errors([self.get_default_error_message()]) return None if not res.get("success"): self.set_non_field_errors([ res.get("error", self.get_default_error_message() ) ]) return None
def __init__(self, request, *args, **kwargs): super(EmailForm, self).__init__(request, *args, **kwargs) res = {} self.user = None try: res = keystoneapi.get_user(self.request.user.id) except Exception as ex: LOG.exception(ex) self.set_non_field_errors([self.get_default_error_message()]) return None if not (res.get("success") or res.get("result")): return None self.user = res.get("result") kwargs["initial"]["email"] = self.user.get("email")
def get(self, *args, **kwargs): user = None res = None try: user_id = self.kwargs.get('user_id') res = keystoneapi.get_user(user_id) except Exception as ex: LOG.exception(str(ex)) pass if res: if res.get("success"): user = res.get("result") if not self.is_valid_url(user): return shortcuts.redirect("/") return super(UserSMSActivateView, self).get(*args, **kwargs)
def resendEmail(request, user_id): try: res = keystoneapi.get_user(user_id) if not (res.get("success") or res.get("result")): raise Exception('Unable to get user details') user = res.get("result") send_registration_email(user, "signup/account_activation_email.html") except Exception as e: LOG.exception(e) return shortcuts.render_to_response('signup/signup_success.html', {'email':settings.DEFAULT_FROM_EMAIL, 'user_id':user.get("id"), 'resentEmail':True, 'resentSuccess':False}) return shortcuts.render_to_response('signup/signup_success.html', {'email':settings.DEFAULT_FROM_EMAIL, 'user_id':user.get("id"), 'resentEmail':True, 'resentSuccess':True})
def get(self, *args, **kwargs): user = None res = None try: user_id = self.kwargs.get('user_id') code = self.kwargs['code'] res = keystoneapi.get_user(user_id) if res and res.get("success"): user = res.get("result") else: raise Exception('Unable to get user details') except Exception as ex: LOG.exception(str(ex)) return shortcuts.redirect("/") if not self.is_valid_url(user, code): return shortcuts.redirect("/") return super(UserResetPasswordView, self).get(*args, **kwargs)
def sendSms(request): # This method serves re-sending SMS multiple times until the OTP is # expired, to cater to SMS sending failures. phone = request.session.get("phone") try: res = keystoneapi.get_user(request.user.id) if not (res.get("success") or res.get("result")): raise Exception() except Exception as ex: LOG.exception(ex) user = res.get("result") sms_activation_code = user.get("sms_activation_code") try: generate_and_send_sms(phone, sms_activation_code) messages.success(request, 'SMS sent successfully') except Exception as ex: LOG.exception(ex) return shortcuts.redirect('horizon:settings:phone:index')
def process_request(self, request): user = None if request.user.is_authenticated(): try: user = keystoneapi.get_user(request.user.id).get("result") except: log.debug("Error while getting user") if user is not None: display_name = user.get('first_name') if display_name is None: display_name = user.get('name') else: #If lastname is taken as the input from the UI, uncomment the below to display user lastname in the UI #last_name = user.get('last_name') #if last_name: # display_name += last_name pass request.session['display_name'] = display_name request.session.save()
def handle(self, request, data): res = {} user = None try: code = data.get("code") user_id = data.get("user_id") try: res = keystoneapi.get_user(user_id) except Exception as ex: LOG.exception(ex) self.set_non_field_errors([self.get_default_error_message()]) return None if not res.get("success"): self.set_non_field_errors(["Invalid Account"]) return None user = res.get("result") if not user: self.set_non_field_errors(["Invalid Account"]) return None else: if user.get("enabled"): self.set_non_field_errors(["Account already activated"]) return None else: sms_activation_code = user.get("sms_activation_code") sms_activation_code_time = \ user.get("sms_activation_code_time") if not (sms_activation_code and sms_activation_code_time): self.set_non_field_errors(["Invalid Activation Code"]) return None if sms_activation_code not in [code]: self.set_non_field_errors(["Invalid Activation Code"]) return None if is_sms_expired(sms_activation_code_time): self.set_non_field_errors(["Activation Code Expired. Click 'Resend OTP'"]) return None user_id = user.get("id") if not user_id: self.set_non_field_errors(["Invalid Account"]) return None _data = {"user_id": user_id} try: res = keystoneapi.activate_user(_data) keystoneapi.update_user(user_id, {"sms_activation_code" : ""}) except Exception as ex: LOG.exception(ex) self.set_non_field_errors([self.get_default_error_message()]) return None try: send_registration_email(user, "signup/registration_success_email.html") except Exception as ex: LOG.exception(ex) except Exception as ex: import traceback traceback.print_exc() LOG.exception(ex) self.set_non_field_errors([self.get_default_error_message()]) return None if not res.get("success"): self.set_non_field_errors([ res.get("error", self.get_default_error_message() ) ]) return None return res