Browse Source

短信验证码查看设备密码

locky 5 tháng trước cách đây
mục cha
commit
8541b72e3c
3 tập tin đã thay đổi với 208 bổ sung47 xóa
  1. 68 1
      Controller/EquipmentManagerV3.py
  2. 97 46
      Controller/UserController.py
  3. 43 0
      Service/TemplateService.py

+ 68 - 1
Controller/EquipmentManagerV3.py

@@ -20,6 +20,7 @@ from Controller.UnicomCombo.WXTechController import WXTechControllerView
 from Model.models import Device_Info, UID_Bucket, UID_Preview, UidSetModel, UidChannelSetModel, \
     Device_User, iotdeviceInfoModel, UIDCompanySerialModel, UnicomDeviceInfo, CountryModel, \
     DeviceCloudPhotoInfo, UidPushModel, ExperienceContextModel, LogModel, UserAudioVideoPush, UIDModel
+from Object.RedisObject import RedisObject
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
 from Service.CommonService import CommonService
@@ -82,6 +83,10 @@ class EquipmentManagerV3(View):
             return self.save_button_user(request_dict, response)
         elif operation == 'getButtonUser':
             return self.get_button_user(request_dict, response)
+        elif operation == 'verifyCode':
+            return self.verify_code(request_dict, response)
+        elif operation == 'viewDevicePassword':
+            return self.view_device_password(request_dict, response)
         else:
             return response.json(414)
 
@@ -684,6 +689,7 @@ class EquipmentManagerV3(View):
             if not dev_info_qs.exists():
                 return response.json(173)
 
+            view_password = ''
             if deviceData.__contains__('View_Password'):
                 encrypt_pwd = deviceData['View_Password']
                 view_password = self.decode_pwd(deviceData['View_Password'])
@@ -733,7 +739,7 @@ class EquipmentManagerV3(View):
                         'channel': ChannelIndex,
                         'nickname': nickname,
                         'device_type': qs[0].Type,
-                        'tb_country': country
+                        'tb_country': country,
                     }
                     UidSetModel.objects.create(**uid_set_create_dict)
                 di_qs = Device_Info.objects.filter(UID=uid)
@@ -1315,3 +1321,64 @@ class EquipmentManagerV3(View):
         except Exception as e:
             return response.json(500, repr(e))
 
+    @staticmethod
+    def verify_code(request_dict, response):
+        """
+        校验验证码(查看设备密码)
+        @param request_dict:
+        @param response:
+        @return:
+        """
+        email = request_dict.get('email', None)
+        phone = request_dict.get('phone', None)
+        uid = request_dict.get('uid', None)
+        authcode = request_dict.get('authcode', None)
+        if not any([email, phone]):
+            return response.json(444)
+        if not all([uid, authcode]):
+            return response.json(444)
+        try:
+            authcode = CommonService.decode_data(authcode.strip())
+            if authcode is None:
+                return response.json(444, 'authcode')
+            user_info = email if email is not None else phone
+            redis = RedisObject()
+            redis_key = '{}_{}_GetDevicePassword'.format(user_info, uid)
+            reset_code = redis.get_data(key=redis_key)
+            if reset_code is False:
+                return response.json(90)
+            if authcode != reset_code:
+                return response.json(121)
+            if not redis.del_data(redis_key):
+                return response.json(10, '删除缓存失败')
+            return response.json(0)
+        except Exception as e:
+            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+
+    @staticmethod
+    def view_device_password(request_dict, response):
+        """
+        查看设备密码
+        @param request_dict:
+        @param response:
+        @return:
+        """
+        uid = request_dict.get('uid', None)
+        if not all([uid]):
+            return response.json(444)
+        try:
+            uid_set_qs = UidSetModel.objects.filter(uid=uid).values('pwd')
+            if uid_set_qs.exists():
+                device_password = uid_set_qs[0]['pwd']
+            else:
+                device_info_qs = Device_Info.objects.filter(UID=uid).values('View_Password')
+                if not device_info_qs.exists():
+                    return response.json(173)
+                device_password = device_info_qs[0]['View_Password']
+            device_password = CommonService.encode_data(device_password)
+            res = {
+                'device_password': device_password
+            }
+            return response.json(0, res)
+        except Exception as e:
+            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))

+ 97 - 46
Controller/UserController.py

@@ -3366,93 +3366,144 @@ class SingleLoginView(TemplateView):
         phone = request_dict.get('phone', None)
         sign_name = request_dict.get('sign_name', 'zosi')
         country_code = request_dict.get('country_code', None)
-        # code_type = 1 表示修改绑定手机号
         code_type = request_dict.get('code_type', None)
-        # 短信签名
-        sign_name = CommonService.confirm_msg_sign_name(sign_name)
-        if email is not None:
-            email = email.strip()
-            # 阿里云的发送邮箱的调用方法
-            return self.get_aliyun_email_code(email, response)
-        elif phone is not None and code_type == "1":
-            phone = phone.strip()
-            country_code = str(country_code.strip())
-            return self.get_change_phone_code(country_code, phone, response, sign_name)
-        elif phone is not None:
-            phone = phone.strip()
-            country_code = str(country_code.strip())
-            return self.get_phone_code(country_code, phone, response, sign_name)
-        else:
+        uid = request_dict.get('uid', None)
+        if not any([email, phone]):
             return response.json(444)
 
+        try:
+            # 查看设备密码,传uid和检验主用户
+            if code_type == '2':
+                if uid is None:
+                    return response.json(444)
+                user_info = email if email is not None else phone
+                # 查询主用户信息
+                device_info_qs = Device_Info.objects.filter(UID=uid).values('vodPrimaryMaster')
+                if not device_info_qs.exists():
+                    return response.json(173)
+                if user_info != device_info_qs[0]['vodPrimaryMaster']:
+                    return response.json(12)
+            # 邮箱验证码
+            if email is not None:
+                email = email.strip()
+                return self.get_aliyun_email_code(email, code_type, uid, response)
+            # 手机验证码
+            else:
+                phone = phone.strip()
+                country_code = str(country_code.strip())
+                # 短信签名
+                sign_name = CommonService.confirm_msg_sign_name(sign_name)
+                return self.get_phone_code(country_code, phone, sign_name, code_type, uid, response)
+        except Exception as e:
+            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+
     @staticmethod
-    def get_aliyun_email_code(email, response):
-        print('阿里云开始')
+    def get_aliyun_email_code(email, code_type, uid, response):
+        """
+        获取邮箱验证码
+        @param email: 邮箱
+        @param code_type:  不传: 单点登录, 2: 查看设备密码
+        @param uid:
+        @param response:
+        @return:
+        """
         data_valid = DataValid()
         # 邮箱匹配
         if data_valid.email_validate(email) is False:
             return response.json(107)
-        reds = RedisObject()
-        key = email + '_SingleLogin'
-        identifying_code = reds.get_data(key=key)
-        # 是否以获取邮箱验证码
-        if identifying_code:
-            return response.json(89)
+        # 查询用户是否存在
         user_qs = Device_User.objects.filter(Q(username=email) | Q(userEmail=email))
-        # 邮箱用户是否已存在
         if not user_qs.exists():
             return response.json(99)
+
+        # 确定缓存key
+        if code_type is None:
+            redis_key = '{}_SingleLogin'.format(email)
+            email_type = 'register_code'
+        elif code_type == '2':
+            redis_key = '{}_{}_GetDevicePassword'.format(email, uid)
+            email_type = 'get_device_password'
+        else:
+            return response.json(444)
+
+        redis_obj = RedisObject()
+        # 检查是否已获取邮箱验证码
+        identifying_code = redis_obj.get_data(key=redis_key)
+        if identifying_code:
+            return response.json(89)
+
         # 生成随机6位数
         identifying_code = RandomStr(6, True)
         # 设置随机数缓存生命周期
-        send_data = TemplateService.email_message(type='register_code', language=response.lang)
+        send_data = TemplateService.email_message(type=email_type, language=response.lang)
         ses = SesClassObject()
         # 发送邮件
         send_res = ses.alyEmailCode(
             send_address_list=[email],
             subject=send_data['title'],
-            body=send_data['body'].replace("{username}", email).replace("{captcha}", str(identifying_code))
+            body=send_data['body'].replace('{username}', email).replace('{captcha}', str(identifying_code))
         )
         if send_res is not True:
             return response.json(44)
-        if reds.set_data(key=key, val=identifying_code, expire=600) is not True:
+        if redis_obj.set_data(key=redis_key, val=identifying_code, expire=600) is not True:
             return response.json(10, 'error')
         return response.json(0)
 
     @staticmethod
-    def get_phone_code(country_code, phone, response, sign_name):
+    def get_phone_code(country_code, phone, sign_name, code_type, uid, response):
+        """
+        获取手机验证码
+        @param country_code: 国家编码
+        @param phone: 手机号码
+        @param sign_name: 短信签名
+        @param code_type: 验证码类型, None: 单点登录, 1: 修改手机号码, 2: 查看设备密码
+        @param uid:
+        @param response:
+        @return:
+        """
         data_valid = DataValid()
         if data_valid.mobile_validate(phone) is not True:
             return response.json(107)
-        reds = RedisObject()
-        reds_key = str(phone) + '_SingleLogin'
-        identifying_code = reds.get_data(key=reds_key)
-        reds_key_ttl = reds.get_ttl(key=reds_key)
-        if reds_key_ttl > 240 and identifying_code:
-            return response.json(90)
-        user_qs = Device_User.objects.filter(Q(username=phone) | Q(phone=phone))
-        if not user_qs.exists():
-            return response.json(102)
-        identifying_code = RandomStr(6, True)
+        # 根据验证码类型确定缓存key和短信模板
+        if code_type is None:
+            user_qs = Device_User.objects.filter(Q(username=phone) | Q(phone=phone))
+            if not user_qs.exists():
+                return response.json(102)
+            redis_key = '{}_SingleLogin'.format(phone)
+            # 短信模板
+            temp_msg = 'SMS_151675019' if country_code == '86' else 'SMS_172200051'
+        elif code_type == '1':
+            redis_key = '{}_ChangePhone'.format(phone)
+            temp_msg = 'SMS_151675018' if country_code == '86' else 'SMS_172165867'
+        elif code_type == '2':
+            redis_key = '{}_{}_GetDevicePassword'.format(phone, uid)
+            temp_msg = 'SMS_479855154' if country_code == '86' else 'SMS_479785146'
+        else:
+            return response.json(444)
+
+        # 根据手机区号处理发送手机号码和签名
         if country_code == '86':
-            # 国内短信推送模板
-            temp_msg = 'SMS_151675019'
             rec_phone = phone
         else:
-            # 国际短信推送模板
-            temp_msg = 'SMS_172200051'
             rec_phone = country_code + phone
             sign_name = 'Ansjer'
 
+        redis_obj = RedisObject()
+        identifying_code = redis_obj.get_data(key=redis_key)
+        reds_key_ttl = redis_obj.get_ttl(key=redis_key)
+        if reds_key_ttl > 240 and identifying_code:
+            return response.json(90)
+        identifying_code = RandomStr(6, True)
+
         # 发送手机验证码
         alisms = AliSmsObject()
         res = alisms.send_code_sms(phone=rec_phone, code=identifying_code, sign_name=sign_name, temp_msg=temp_msg)
-        if res["Code"] == "OK":
-            if reds.set_data(key=reds_key, val=identifying_code, expire=300) is not True:
+        if res['Code'] == 'OK':
+            if redis_obj.set_data(key=redis_key, val=identifying_code, expire=300) is not True:
                 return response.json(10, '生成缓存系统错误')
             return response.json(0)
         else:
-            return response.json(10, res["Message"])
+            return response.json(10, res['Message'])
 
     def change_password(self, request_dict, response):
         phone = request_dict.get('phone', None)

+ 43 - 0
Service/TemplateService.py

@@ -130,4 +130,47 @@ class TemplateService:
 """
                 }
             }
+        elif type == 'get_device_password':
+                data = {
+                    'cn': {
+                        'title': '查看设备密码',
+                        'body': """
+                            <!DOCTYPE html>
+        <html lang="en">
+        <head>
+            <meta charset="UTF-8">
+            <title>Title</title>
+        </head>
+        <body>
+        <div class="content"
+             style="overflow: hidden;padding:30px 10% 70px 10%;margin:0 10%;background-color: #fff;box-shadow:0 4px 20px rgba(0,0,0,0.1);word-break: break-all;">
+            <h2 style="margin: 30px 0;">您好,{username}</h2>
+            <p style="margin-bottom: 40px;">请输入验证码查看设备密码,有效期5分钟:</p>
+            <span style="padding: 10px 20px; font-size: 24px;background-color: #EB6F5A;border-radius:4px;color:#fff;">{captcha}</span>
+        </div>
+        </body>
+        </html>
+                            """,
+                    },
+                    'en': {
+                        'title': 'View Device Password',
+                        'body': """
+                            <!DOCTYPE html>
+        <html lang="en">
+        <head>
+            <meta charset="UTF-8">
+            <title>Title</title>
+        </head>
+        <body>
+        <div class="content"
+             style="overflow: hidden;padding:30px 10% 70px 10%;margin:0 10%;background-color: #fff;box-shadow:0 4px 20px rgba(0,0,0,0.1);word-break: break-all;">
+            <h2 style="margin: 30px 0;">Hello, {username}</h2>
+            <p style="margin-bottom: 40px;">Please input code to view device password. only valid in 5 minutes!</p>
+            <span style="padding: 10px 20px; font-size: 24px;background-color: #EB6F5A;border-radius:4px;color:#fff;">{captcha}</span>
+        </div>
+        </body>
+        </html>
+        """
+                    }
+                }
         return data[language]