def post(self): """Clear the cookie and set defend.""" try: data = DotDict(json_decode(self.request.body)) iosid = data.get("iosid", "") logging.info("[UWEB] logout request: %s, uid: %s", data, self.current_user.uid) except: self.write_ret(ErrorCode.ILLEGAL_DATA_FORMAT) logging.error("[UWEB] illegal format, body:%s", self.request.body) else: # 1: if there are tids, set defend for tid in data.tids: update_mannual_status( self.db, self.redis, tid, UWEB.DEFEND_STATUS.YES) # 2: remove ios from push_list ios_push_list_key = get_ios_push_list_key(self.current_user.uid) ios_push_list = self.redis.getvalue(ios_push_list_key) ios_push_list = ios_push_list if ios_push_list else [] if iosid in ios_push_list: ios_push_list.remove(iosid) self.redis.set(ios_push_list_key, ios_push_list) ios_badge_key = get_ios_badge_key(iosid) self.redis.delete(ios_badge_key) logging.info("[UWEB] uid:%s, ios_push_lst: %s", self.current_user.uid, ios_push_list) finally: # 3: clear cookie self.clear_cookie(self.app_name) self.write_ret(ErrorCode.SUCCESS)
def get_iosbadge(iosid, redis): """Get ios_badge throuth iosid. """ ios_badge = None try: ios_badge_key = get_ios_badge_key(iosid) ios_badge = redis.getvalue(ios_badge_key) if ios_badge is not None: ios_badge = int(ios_badge) + 1 redis.setvalue(ios_badge_key, ios_badge) except Exception as e: logging.exception("Get push key failed. Exception: %s", e.args) finally: return ios_badge
def send_jb_sms(self, tmobile, umobile, tid): """ #NOTE: deprecated. It should never be invoked. """ unbind_sms = SMSCode.SMS_UNBIND biz_type = QueryHelper.get_biz_type_by_tmobile(tmobile, self.db) if biz_type != UWEB.BIZ_TYPE.YDWS: ret = DotDict(status=ErrorCode.SUCCESS) else: ret = SMSHelper.send_to_terminal(tmobile, unbind_sms) ret = json_decode(ret) status = ret["status"] if status == ErrorCode.SUCCESS: self.db.execute( "UPDATE T_TERMINAL_INFO" " SET service_status = %s" " WHERE mobile = %s", UWEB.SERVICE_STATUS.TO_BE_UNBIND, tmobile, ) terminals = self.db.query( "SELECT id FROM T_TERMINAL_INFO" " WHERE owner_mobile = %s" " AND service_status = %s", umobile, UWEB.SERVICE_STATUS.ON, ) # clear user if len(terminals) == 0: self.db.execute("DELETE FROM T_USER" " WHERE mobile = %s", umobile) lastinfo_key = get_lastinfo_key(umobile) lastinfo_time_key = get_lastinfo_time_key(umobile) ios_id_key = get_ios_id_key(umobile) ios_badge_key = get_ios_badge_key(umobile) keys = [lastinfo_key, lastinfo_time_key, ios_id_key, ios_badge_key] self.redis.delete(*keys) logging.info("[UWEB] Delete User: %s", umobile) logging.info("[UWEB] umobile: %s, tid: %s, tmobile: %s SMS unbind successfully.", umobile, tid, tmobile) else: logging.error( "[UWEB] umobile: %s, tid: %s, tmobile: %s SMS unbind failed. Message: %s", umobile, tid, tmobile, ErrorCode.ERROR_MESSAGE[status], ) return status
def post(self): username = self.get_argument("username") password = self.get_argument("password") iosid = self.get_argument("iosid", '') user_type = self.get_argument("user_type", UWEB.USER_TYPE.PERSON) biz_type = self.get_argument("biz_type", UWEB.BIZ_TYPE.YDWS) versionname = self.get_argument("versionname", "") version_type = int(self.get_argument("version_type", 0)) logging.info("[UWEB] IOS login request, username: %s, password: %s, iosid: %s, user_type: %s", username, password, iosid, user_type) # must check username and password avoid sql injection. if not (username.isalnum() and password.isalnum()): status = ErrorCode.ILLEGAL_LABEL self.write_ret(status) return # check the user, return uid, tid, sim and status cid, oid, uid, terminals, user_type, status = self.login_passwd_auth( username, password, user_type) logging.info("[UWEB] Login auth, cid:%s, oid:%s, uid:%s, user_type:%s", cid, oid, uid, user_type) if status == ErrorCode.SUCCESS: # keep the login log login_info = dict(uid=uid, role=0, method=2, versionname=versionname) record_login_user(login_info, self.db) self.bookkeep(dict(cid=cid, oid=oid, uid=uid, tid=terminals[0].tid, sim=terminals[0].sim)) user_info = QueryHelper.get_user_by_uid(uid, self.db) # NOTE: add cars_info, it's same as lastinfo cars_info = {} if user_type == UWEB.USER_TYPE.PERSON: terminals = QueryHelper.get_terminals_by_uid(uid, biz_type, self.db) elif user_type == UWEB.USER_TYPE.OPERATOR: terminals = QueryHelper.get_terminals_by_oid(oid, biz_type, self.db) elif user_type == UWEB.USER_TYPE.CORP: terminals = QueryHelper.get_terminals_by_cid(cid, biz_type, self.db) else: logging.error("[UWEB] Invalid user_type: %s", user_type) for terminal in terminals: # 1: get terminal tid = terminal.tid group_info = get_group_info_by_tid(self.db, tid) terminal_info_key = get_terminal_info_key(tid) terminal_cache = self.redis.getvalue(terminal_info_key) # NOTE: the latest gps, gsm, pbat kept in redis if terminal_cache: terminal['gps'] = terminal_cache['gps'] terminal['gsm'] = terminal_cache['gsm'] terminal['pbat'] = terminal_cache['pbat'] mobile = terminal['mobile'] terminal['keys_num'] = 0 if terminal['login'] == GATEWAY.TERMINAL_LOGIN.SLEEP: terminal['login'] = GATEWAY.TERMINAL_LOGIN.ONLINE # NOTE: if alias is null, provide cnum or sim instead terminal['alias'] = QueryHelper.get_alias_by_tid( tid, self.redis, self.db) fobs = self.db.query("SELECT fobid FROM T_FOB" " WHERE tid = %s", tid) terminal['fob_list'] = [fob.fobid for fob in fobs] terminal['sim'] = terminal['mobile'] # 2: get location location = QueryHelper.get_location_info(tid, self.db, self.redis) if location and not (location.clatitude or location.clongitude): location_key = get_location_key(str(tid)) locations = [location, ] locations = get_locations_with_clatlon(locations, self.db) location = locations[0] self.redis.setvalue( location_key, location, EVENTER.LOCATION_EXPIRY) if location and location['name'] is None: location['name'] = '' avatar_name, avatar_path, avatar_full_path, avatar_time = self.get_avatar_info(mobile) service_status = QueryHelper.get_service_status_by_tmobile(self.db, mobile) car_dct = {} if location and location['type'] == 1: # cellid location['locate_error'] = 500 # mile car_info = dict(defend_status=terminal['defend_status'] if terminal['defend_status'] is not None else 1, service_status=service_status, mannual_status=terminal['mannual_status'] if terminal['mannual_status'] is not None else 1, fob_status=terminal['fob_status'] if terminal['fob_status'] is not None else 0, timestamp=location['timestamp'] if location else 0, speed=location.speed if location else 0, # NOTE: degree's type is Decimal, float() it before json_encode degree=float(location.degree) if location else 0.00, locate_error=location.get('locate_error', 20) if location else 20, bt_name=terminal['bt_name'] if terminal.get('bt_name', None) is not None else '', bt_mac=terminal['bt_mac'] if terminal.get('bt_mac', None) is not None else '', dev_type=terminal['dev_type'] if terminal.get('dev_type', None) is not None else 'A', name=location.name if location else '', type=location.type if location else 1, latitude=location['latitude'] if location else 0, longitude=location['longitude'] if location else 0, clatitude=location['clatitude'] if location else 0, clongitude=location['clongitude'] if location else 0, login=terminal['login'] if terminal['login'] is not None else 0, gps=terminal['gps'] if terminal['gps'] is not None else 0, gsm=terminal['gsm'] if terminal['gsm'] is not None else 0, pbat=terminal['pbat'] if terminal['pbat'] is not None else 0, mobile=terminal['mobile'], owner_mobile=terminal['owner_mobile'], alias=terminal['alias'], #keys_num=terminal['keys_num'] if terminal['keys_num'] is not None else 0, keys_num=0, group_id=group_info['group_id'], group_name=group_info['group_name'], icon_type=terminal['icon_type'], avatar_path=avatar_path, avatar_time=avatar_time, fob_list=terminal['fob_list'] if terminal['fob_list'] else []) car_dct[tid] = car_info cars_info.update(car_dct) # uid --> iosid_push_list # check iosid whether exists in a old ios_push_list old_ios_push_list_key = self.redis.get(iosid) if old_ios_push_list_key: old_ios_push_list = self.redis.getvalue(old_ios_push_list_key) if not isinstance(old_ios_push_list, list): self.redis.delete(old_ios_push_list_key) old_ios_push_list = [] if old_ios_push_list and (iosid in old_ios_push_list): logging.info("[UWEB] iosid:%s has existed in a old_ios_push_list: %s, so remove iosid from the list.", iosid, old_ios_push_list) old_ios_push_list.remove(iosid) self.redis.set(old_ios_push_list_key, old_ios_push_list) ios_push_list_key = get_ios_push_list_key(uid) ios_push_list = self.redis.getvalue(ios_push_list_key) ios_push_list = ios_push_list if ios_push_list else [] if iosid not in ios_push_list: ios_push_list.append(iosid) self.redis.set(ios_push_list_key, ios_push_list) self.redis.set(iosid, ios_push_list_key) ios_badge_key = get_ios_badge_key(iosid) self.redis.setvalue(ios_badge_key, 0, UWEB.IOS_ID_INTERVAL) logging.info("[UWEB] username %s, ios_push_lst: %s", username, ios_push_list) if user_info: self.login_sms_remind(uid, user_info.mobile, terminals, login="******") else: pass # corp maybe no user_info push = dict(id='', key='') json_data = WSPushHelper.register_wspush(uid, self.redis) if json_data: data = json_data['data'] id = data.get('push_id', '') key = data.get('psd', '') push['id'] = id push['key'] = key if version_type >= 1: terminals = [] for k, v in cars_info.iteritems(): v.update({'tid': k}) terminals.append(v) self.write_ret(status, dict_=DotDict(wspush=push, name=user_info.name if user_info else username, user_type=user_type, terminals=terminals)) else: self.write_ret(status, dict_=DotDict(wspush=push, name=user_info.name if user_info else username, user_type=user_type, cars_info=cars_info, cars=terminals)) else: logging.info("[UWEB] username: %s login failed, message: %s", username, ErrorCode.ERROR_MESSAGE[status]) self.write_ret(status)