Beispiel #1
0
    def get(self, username, gid, userinfo='', *args, **kwargs):
        sn = GDevRdsInts.send_cmd(*get_sn_of_gid(gid))

        logger.debug('username = %r, gid = %r, sn = %r, userinfo = %r',
                     username, gid, sn, userinfo)
        GDevRdsInts.send_cmd(*hdel_wechat_gid(username, gid))
        GDevRdsInts.send_multi_cmd(
            *combine_redis_cmds(unfollow_group(gid, sn, username)))

        accounts = GDevRdsInts.send_cmd(*get_group_followers(gid))
        logger.debug('share, accounts={0}'.format(accounts))
        # accounts is set object
        primary_account = GDevRdsInts.send_cmd(*get_group_primary(gid))

        accounts.add(primary_account)
        sn = GDevRdsInts.send_cmd(*get_sn_of_gid(gid))
        accounts.add(sn)

        logger.debug('share, accounts={0}'.format(accounts))

        for acc in accounts:
            if acc[:3] == 'wx#':
                continue

            GMQDispRdsInts.send_cmd(*shortcut_mq(
                'cloud_push',
                # sourcer, cb, from, description
                push_pack(username,
                          'unfollow',
                          2,
                          ':'.join((username, gid)),
                          account=acc)))
        return 'success'
Beispiel #2
0
    def get(self, gid, nice_gid, *args, **kwargs):
        old_gid = GDevRdsInts.send_cmd(*get_old_gid(nice_gid))
        if old_gid:
            return {'status': 1}

        # sn & gid mapping
        sn = GDevRdsInts.send_cmd(*get_sn_of_gid(gid))
        if sn is None:
            sn = GDevRdsInts.send_cmd(*get_sn_of_gid(nice_gid))
            if sn is None:
                return {'status': 2}

        GDevRdsInts.send_multi_cmd(*combine_redis_cmds(set_gid_of_sn(sn, nice_gid), set_sn_of_gid(nice_gid, sn), del_sn_of_gid(gid)))

        # gid & primary mapping
        primary = GDevRdsInts.send_cmd(*get_group_primary(gid))
        GDevRdsInts.send_multi_cmd(*combine_redis_cmds(set_group_primary(nice_gid, primary), del_group_primary(gid)))

        followers = GDevRdsInts.send_cmd(*get_group_followers(gid))
        for follower in followers:
            GDevRdsInts.send_multi_cmd(*combine_redis_cmds(follow_group(gid, sn, follower)))

        GDevRdsInts.send_multi_cmd(*combine_redis_cmds(set_nice_gid(gid, nice_gid), set_old_gid(nice_gid, gid)))
        user_info, nickname = GDevRdsInts.send_multi_cmd(*combine_redis_cmds(get_user_info(gid), get_user_nickname(gid)))
        if user_info:
            GDevRdsInts.send_cmd(*set_user_info(nice_gid, user_info))
        if nickname:
            GDevRdsInts.send_cmd(*set_user_nickname(nice_gid, nickname))

        GMQDispRdsInts.send_multi_cmd(*combine_redis_cmds(
                shortcut_mq('gen_mysql', mysql_pack(DB_TBL_GID_INFO, {'sn': sn, 'status': 'used'}, action=2, ref_kvs={'gid': nice_gid})),
                shortcut_mq('gen_mysql', mysql_pack(DB_TBL_DEVICE_INFO, {'nice_gid': nice_gid}, action=2, ref_kvs={'sn': sn}))
            ))
        return {'status': 0}
Beispiel #3
0
    def post(self, user_name, gid, share_to, location, text, type, files,
             *args, **kwargs):
        primary_account = GDevRdsInts.send_cmd(*get_group_primary(gid))
        if primary_account is None:
            return {'status': 1}

        ts = float('%0.2f' % time.time())
        share_id = ':'.join(('share', str(ts), gid, user_name))
        GDevRdsInts.send_cmd(*add_self_share(user_name, ts, share_id))
        GDevRdsInts.send_cmd(*save_share_info(
            share_id, user_name, gid, share_to, location, text, type, files))

        accounts = GDevRdsInts.send_cmd(*get_group_followers(gid))
        logger.debug('share, accounts={0}'.format(accounts))
        # accounts is set object
        accounts.add(primary_account)
        sn = GDevRdsInts.send_cmd(*get_sn_of_gid(gid))
        accounts.add(sn)

        logger.debug('share, accounts={0}'.format(accounts))

        for acc in accounts:
            GDevRdsInts.send_cmd(*add_share(acc, share_id, ts))
            if acc == user_name:
                continue
            elif acc[:3] == 'wx#':
                continue
            GMQDispRdsInts.send_cmd(*shortcut_mq(
                'cloud_push',
                push_pack(user_name,
                          'share',
                          2,
                          ':'.join((share_id, text, type, files)),
                          account=acc)))
        return {'share_id': share_id}
Beispiel #4
0
    def post(self, user_name, share_id, *args, **kwargs):
        gid = ''
        sl = share_id.split(':')
        author = ''
        if len(sl) == 4:
            _, _, gid, author = sl
        elif len(sl) == 3:
            _, _, author = sl

        logger.debug(u'delete share, gid={0}, author={1}, acc={2}'.format(
            gid, author, user_name))

        if not self.can_delete(gid, author, user_name):
            return {'status': 1}

        share_info = GDevRdsInts.send_cmd(*retrieve_share_info(share_id))
        if share_info is None:
            return {'status': 2}

        files = share_info.get('files')
        if files:
            fns = json.loads(files)
            logger.debug(
                u'delete share, share_id={0}, gid={1}, fns={2}'.format(
                    share_id, gid, fns))
            for k, v in fns.items():
                urllib2.urlopen(BEIQI_FILE_DELETE_URL.format(file=bs2utf8(v)))

        comment_id_list = GDevRdsInts.send_cmd(*get_comment(share_id))
        if comment_id_list is not None:
            for comment_id in comment_id_list:
                fn = GDevRdsInts.send_cmd(
                    *get_comment_file(share_id, comment_id))
                urllib2.urlopen(BEIQI_FILE_DELETE_URL.format(file=fn))
                GDevRdsInts.send_cmd(*del_comment_info(share_id, comment_id))

        GDevRdsInts.send_multi_cmd(*combine_redis_cmds(
            del_share(user_name, share_id), del_comment(share_id),
            del_share_info(share_id)))

        if gid:
            sn = GDevRdsInts.send_cmd(*get_sn_of_gid(gid))

            accounts = GDevRdsInts.send_cmd(*get_group_followers(gid))
            primary_account = GDevRdsInts.send_cmd(*get_group_primary(gid))
            accounts.add(primary_account)
            accounts.add(sn)

            logger.debug(u'accounts={0}'.format(accounts))
            for user in accounts:
                if user_name == user:
                    continue
                GDevRdsInts.send_cmd(*del_share(user, share_id))
                GMQDispRdsInts.send_cmd(*shortcut_mq(
                    'cloud_push',
                    push_pack(
                        user_name, 'delete_share', 2, share_id, account=user)))

        return {'status': 0}
Beispiel #5
0
    def can_delete(self, gid, author_acc, del_acc):
        # owner
        if author_acc == del_acc:
            return True

        # device
        dev_sn = GDevRdsInts.send_cmd(*get_sn_of_gid(gid))
        if self.is_device(del_acc):
            logger.debug(
                u'DeleteShareHandler::can_delete, is_device={0}'.format(
                    del_acc))
            return del_acc == dev_sn
        # primary
        return self.get_dev_primary_by_sn(dev_sn) == del_acc
Beispiel #6
0
def msg_2_ios(author, type, files, text=''):
    gid_list = get_user_gids(author, dev_filter)
    logger.debug('msg_2_ios:: gid_list=%r, author=%r', gid_list, author)

    share_to = ''
    location = ''

    resp = {}
    accounts = set([])
    ts = float('%0.2f' % time.time())
    for gid in gid_list:
        primary_account = dev_filter.send_cmd(*get_group_primary(gid))
        if primary_account is None:
            return json.dumps({'status': 1})

        share_id = ':'.join(('share', str(ts), gid, author))
        dev_filter.send_cmd(*add_self_share(author, ts, share_id))
        dev_filter.send_cmd(*save_share_info(share_id,
                                             author,
                                             gid,
                                             share_to,
                                             location,
                                             text,
                                             type,
                                             files,
                                             come_from='wechat'))

        accounts.update(dev_filter.send_cmd(*get_group_followers(gid)))
        accounts.add(primary_account)
        accounts.add(dev_filter.send_cmd(*get_sn_of_gid(gid)))
        resp[gid] = {'share_id': share_id}

    send_accounts = filter(lambda u: u != author and should_send_ios(u, type),
                           accounts)
    logger.debug('msg_2_ios, send_accounts={0}'.format(send_accounts))

    for acc in send_accounts:
        dev_filter.send_cmd(*add_share(acc, share_id, ts))
        mq_hub.send_cmd(*shortcut_mq(
            'cloud_push',
            # sourcer, cb, from, description
            push_pack(author,
                      'share',
                      2,
                      ':'.join((share_id, text, type, files)),
                      account=acc)))
    return resp
Beispiel #7
0
    def get(self, username, api_key, pwd="", *args, **kwargs):
        """
        生成SSO认证token
        :param username:
        :param api_key:
        :param pwd: device no pwd, app account has pwd
        :param args:
        :param kwargs:
        :return:
        """

        user_agent = urllib.unquote(bs2utf8(
            self.request.headers['user-agent']))
        api_ob = beiqi_keys.get(api_key)
        if not api_ob:
            logger.warn("gen_tk api_ob:%s, api_key:%s" % (api_ob, api_key))
            self.set_status(401)
            return

        remote_ip = bs2utf8(self.request.remote_ip)

        if not is_email(username):
            # 设备没有pid时登录
            rc4_key = api_ob.get('rc4_key')
            if rc4_key is None:
                logger.debug(
                    'api_key={0}, username={1} rc4_key not exists'.format(
                        api_key, username))
                self.set_status(400)
                return

            sn, ts = decrypt_username(username, rc4_key)
            sql = "SELECT 1 FROM {db} WHERE sn = '{sn}'".format(
                db=DB_TBL_DEVICE_INFO, sn=sn)
            ret_list = DBBeiqiSspInst.query(sql)
            if len(ret_list) == 0:
                logger.debug('ret_list={0}, sn={1}'.format(ret_list, sn))
                self.set_status(400)
                return

            saved_ts = GDevRdsInts.send_cmd(*get_tk_time(sn))
            if saved_ts == ts:
                logger.debug('ts={0} the same with saved_ts'.format(ts))
                self.set_status(400)
                return

            GDevRdsInts.send_cmd(*set_tk_time(sn, ts))

            login_ts = time.strftime(fmt, time.gmtime())
            GMQDispRdsInts.send_cmd(*shortcut_mq(
                'gen_mysql',
                mysql_pack(DB_TBL_USER_INFO, {
                    'last_login_ts': login_ts,
                    'last_login_ip': remote_ip,
                    'last_login_agent': user_agent
                },
                           action=2,
                           ref_kvs={'username': sn})))
            return gen_token(api_ob.get('s'), sn, 1, account_rds=GAccRdsInts)

        gid = username.split('@')[0]
        if len(gid) == 6:
            # 设备登录
            sn = GDevRdsInts.send_cmd(*get_sn_of_gid(gid))
            logger.debug('beiqi sso, username=%r, gid=%r, sn=%r' %
                         (username, gid, sn))
            # primary = dev_filter.send_cmd(*get_dev_primary(pid))
            if sn:
                # django used gmttime, so we'd better use gmttime.
                login_ts = time.strftime(fmt, time.gmtime())
                GMQDispRdsInts.send_cmd(*shortcut_mq(
                    'gen_mysql',
                    mysql_pack(DB_TBL_USER_INFO, {
                        'last_login_ts': login_ts,
                        'last_login_ip': remote_ip,
                        'last_login_agent': user_agent
                    },
                               action=2,
                               ref_kvs={'username': username})))
                return gen_token(api_ob.get('s'),
                                 username,
                                 1,
                                 account_rds=GAccRdsInts)
            else:
                logger.debug('gid={0} invalid no sn'.format(gid))
                self.set_status(403)
                return

        expect_pwd = GAccRdsInts.send_cmd(*get_pwd(username))

        if expect_pwd is not None:
            if expect_pwd != cipher_pwd(pwd):
                logger.warn(
                    'pwd incorrect: username = {0}, pwd={1}, expect_pwd={2}'.
                    format(username, cipher_pwd(pwd), expect_pwd))
                self.set_status(401)
                return
        else:
            # not in redis, check mysql
            sql = "select password from {db} where username='******'".format(
                db='ssp_user_login', username=username)
            expect_pwd = DBBeiqiSspInst.query(sql)
            if len(expect_pwd) == 0:
                logger.debug('account={0} not exist'.format(username))
                self.set_status(401)
                return
            else:
                pwd_inmysql = expect_pwd[0].get('password')
                pwd_inmysql = pwd_inmysql.encode(
                    'utf8') if pwd_inmysql is not None else pwd_inmysql
                if pwd_inmysql != cipher_pwd(pwd):
                    logger.debug(
                        'pwd incorrect: username = {0}, pwd={1}, expect_pwd={2}'
                        .format(username, cipher_pwd(pwd), expect_pwd))
                    self.set_status(401)
                    return

        login_ts = time.strftime(fmt, time.gmtime())
        GMQDispRdsInts.send_cmd(*shortcut_mq(
            'gen_mysql',
            mysql_pack(DB_TBL_USER_INFO, {
                'last_login_ts': login_ts,
                'last_login_ip': remote_ip,
                'last_login_agent': user_agent
            },
                       action=2,
                       ref_kvs={'username': username})))
        return gen_token(api_ob.get('s'), username, 1, account_rds=GAccRdsInts)