Example #1
0
def handle_url(aConfig, environ, session):
    global gTileCache

    def handle_index(environ, session):
        statuscode, mimetype, body = 403, 'text/plain', 'Access deny'
        return statuscode, mimetype, body

    user_id = None
    if session and '_id' in session:
        user_id = session['_id']
    statuscode, mimetype, body = 200, 'text/json',  '{}'
    app = aConfig['gConfig']['wsgi']['application']
    urllist = []
    for key in aConfig['gConfig']['applications'][app]['url_mapping'].keys():
        urllist.append(Rule(key, endpoint=aConfig['gConfig']['applications'][app]['url_mapping'][key]))
    urlmap = Map(urllist, converters={'bool': BooleanConverter})
    urls = urlmap.bind_to_environ(environ)
    querydict, buf, stream = get_querydict_by_GET_POST(environ)
    try:
        endpoint, args = urls.match()
        if endpoint == 'handle_index':
            statuscode, mimetype, body = handle_index(environ, session)
        else:
            body = json.dumps({'result':u'access_deny'}, ensure_ascii=True, indent=4)

    # except HTTPException, e:
    except Exception as e:
        traceback.print_exc()
        body = json.dumps({'result':u'error:%s' % e.message}, ensure_ascii=True, indent=4)

    # if session:
    #     aConfig['gSessionStore'].save(session)
    # for k in hh.keys():
    #     headers[k] = hh[k]
    return statuscode, mimetype, body
Example #2
0
def handle_url(aConfig, environ, session):
    global gWebSocketsMap, gQueueSensor

    def online(websocket):
        if websocket and not websocket.closed:
            v = str(websocket.__hash__())
            if not v in gWebSocketsMap:
                gWebSocketsMap[v] = websocket

    def offline(websocket):
        v = str(websocket.__hash__())
        websocket.close()
        del gWebSocketsMap[v]

    def handle_uv4l_stun(session, querydict):
        ret = ''
        if 'uv4l' in aConfig['gConfig']['applications'][app]:
            uv4l = aConfig['gConfig']['applications'][app]['uv4l']
            href = '%s://%s:%s%s' % (uv4l['protocol'],
                                         uv4l['host'],
                                         uv4l['port'],
                                         uv4l['stream_webrtc_url']
                                         )
            cert = None
            if 'ssl_cert' in uv4l and os.path.exists(os.path.join(module_path(), uv4l['ssl_cert'])):
                cert = os.path.join(module_path(), uv4l['ssl_cert'])
            statuscode, mimetype, s = handle_http_proxy(aConfig, environ, real_url=href, cert=cert)
            if statuscode == 200:
                scriptlines = s.split('\n')
                arr = filter(lambda x: '{url: "stun:' in x, scriptlines)
                stuns = []
                for i in arr:
                    stuns.append(i[i.index('stun:')+5:i.rindex('"')])
                # print(stuns)
                signal_server = '%s:%s' % (aConfig['gConfig']['applications'][app]['uv4l']['host'], aConfig['gConfig']['applications'][app]['uv4l']['port'])
                protocol = '%s' % aConfig['gConfig']['applications'][app]['uv4l']['protocol']
                websocket_protocol = '%s' % aConfig['gConfig']['applications'][app]['uv4l']['websocket_protocol']
                ret = json.dumps({'stuns:':stuns, 'signal_server':signal_server, 'websocket_protocol':websocket_protocol, 'protocol':protocol}, ensure_ascii=True, indent=4)
        return ret

    def handle_index(environ, session):
        app = aConfig['gConfig']['wsgi']['application']
        statuscode, mimetype, body =  handle_static(aConfig, environ, aConfig['gConfig']['applications'][app]['static']['page']['indexpage'])
        return statuscode, mimetype, body

    def handle_get_post(environ, session, querydict):
        app = aConfig['gConfig']['wsgi']['application']
        statuscode, mimetype, body =  200, 'text/plain',  'ok'
        if 'serial_no' in querydict \
                and 'ip' in querydict \
                and 'op' in querydict\
                and 'type' in querydict:

            if querydict['op']  in [OPERATOR['OP_REGISTER'], OPERATOR['OP_TRANSFER']]:
                if gQueueSensor and gQueueSensor.full():
                    first = gQueueSensor.get()
                if gQueueSensor:
                    gQueueSensor.put(querydict)

        else:
            body = 'serial_no of sensor ,ip , op, type are needed'
        return statuscode, mimetype, body


    statuscode, mimetype, body = 200, 'text/json',  '{}'
    app = aConfig['gConfig']['wsgi']['application']
    urllist = []
    for key in aConfig['gConfig']['applications'][app]['url_mapping'].keys():
        urllist.append(Rule(key, endpoint=aConfig['gConfig']['applications'][app]['url_mapping'][key]))
    urlmap = Map(urllist, converters={'bool': BooleanConverter})
    urls = urlmap.bind_to_environ(environ)
    querydict, buf, stream = get_querydict_by_GET_POST(environ)
    endpoint = ''
    try:
        endpoint, args = urls.match()
        # print(endpoint)
        if endpoint == 'handle_index':
            statuscode, mimetype, body = handle_index(environ, session)
        # elif endpoint == 'handle_login':
        #     hh, body = handle_login(session,  querydict)
        # elif endpoint == 'handle_logout':
        #     hh, body = handle_logout(session)
        elif endpoint == 'handle_uv4l_stun':
            body = handle_uv4l_stun(session, querydict)
        elif endpoint == 'handle_get_post':
            statuscode, mimetype, body = handle_get_post(environ, session, querydict)
        else:
            body = json.dumps({'result':'access_deny'}, ensure_ascii=True, indent=4)

    # except HTTPException, e:
    except Exception as e:
        # print(e)
        body = json.dumps({'result':'access_deny'}, ensure_ascii=True, indent=4)

    return statuscode, mimetype, body
Example #3
0
def handle_url(aConfig, environ, session):
    global gJoinableQueue, gWebSocketsMap
    def handle_index(environ, session):
        app = aConfig['gConfig']['wsgi']['application']
        statuscode, headers, body =  handle_static(aConfig, environ, aConfig['gConfig']['applications'][app]['static']['page']['indexpage'])
        return statuscode, headers, body

    def user_query(session, querydict):
        ret = []
        app = aConfig['gConfig']['wsgi']['application']
        db, collection = get_collection(app, 'main', 'collection_users')
        q = {}
        limit = 0
        skip = 0
        user_detail = False
        if querydict.has_key('user_detail') and querydict['user_detail'] is True:
            user_detail = True
            del querydict['user_detail']
        if querydict.has_key('limit'):
            limit = int(querydict['limit'])
            del querydict['limit']
        if querydict.has_key('skip'):
            skip = int(querydict['skip'])
            del querydict['skip']
        if querydict.has_key('username'):
            if isinstance(querydict['username'], str) or isinstance(querydict['username'], unicode):
                q['username'] = querydict['username']
            if isinstance(querydict['username'], list):
                q['username'] = {'$in': querydict['username']}
            if isinstance(querydict['username'], dict):
                q['username'] = querydict['username']
        if querydict.has_key('_id'):
            if isinstance(querydict['_id'], str) or isinstance(querydict['_id'], unicode):
                q['_id'] = add_mongo_id(querydict['_id'])
            if isinstance(querydict['_id'], list):
                q['_id'] = {'$in': [add_mongo_id(i) for i in querydict['_id']]}
            if isinstance(querydict['_id'], dict):
                q['_id'] = querydict['_id']
        rec = list(collection.find(q).limit(limit).skip(skip))
        keys = list(gWebSocketsMap.keys())
        for i in rec:
            if user_detail:
                if str(i['_id']) in keys:
                    i['online_status'] = 'online'
                else:
                    i['online_status'] = 'offline'
            ret.append(i)
        return ret

    def group_query(session, querydict={}):
        ret = []
        app = aConfig['gConfig']['wsgi']['application']
        db, collection = get_collection(app, 'main', 'collection_groups')
        q = {}
        limit = 0
        skip = 0
        if querydict.has_key('limit'):
            limit = int(querydict['limit'])
            del querydict['limit']
        if querydict.has_key('skip'):
            skip = int(querydict['skip'])
            del querydict['skip']
        if querydict.has_key('group_name'):
            if isinstance(querydict['group_name'], str) or isinstance(querydict['group_name'], unicode):
                q['group_name'] = querydict['group_name']
            if isinstance(querydict['group_name'], list):
                q['group_name'] = {'$in': querydict['group_name']}
            if isinstance(querydict['group_name'], dict):
                q['group_name'] = querydict['group_name']
        if querydict.has_key('_id'):
            if isinstance(querydict['_id'], str) or isinstance(querydict['_id'], unicode):
                q['_id'] = querydict['_id']
            if isinstance(querydict['_id'], list):
                q['_id'] = {'$in': querydict['_id']}
        ret = list(collection.find(add_mongo_id(q)).limit(limit).skip(skip))
        if querydict.has_key('user_detail') and querydict['user_detail'] is True:
            keys = list(gWebSocketsMap.keys())
            for i in ret:
                idx = ret.index(i)
                detail = []
                userlist = user_query(session, {'_id':i['members']})
                for j in userlist:
                    if j.has_key('contacts'):
                        del j['contacts']
                    if j.has_key('password'):
                        del j['password']
                    if str(j['_id']) in keys:
                        j['online_status'] = 'online'
                    else:
                        j['online_status'] = 'offline'
                    detail.append(j)
                ret[idx]['members'] = detail
        return ret

    def group_get(session, querydict):
        rec = group_query(session, querydict)
        if len(rec)>0:
            ret = json.dumps(remove_mongo_id(rec), ensure_ascii=True, indent=4)
        else:
            ret = json.dumps({'result':u'query_no_record'}, ensure_ascii=True, indent=4)
        return ret



    def user_group_get(session, querydict):
        ret = []
        app = aConfig['gConfig']['wsgi']['application']
        db, collection = get_collection(app, 'main', 'collection_groups')
        q = {}
        if querydict.has_key('username'):
            if isinstance(querydict['username'], str) or isinstance(querydict['username'], unicode) or isinstance(querydict['username'], dict):
                q['username'] = querydict['username']
        if querydict.has_key('_id'):
            if isinstance(querydict['_id'], str) or isinstance(querydict['_id'], unicode):
                q['_id'] = add_mongo_id(querydict['_id'])
        if len(list(q.keys()))>0:
            users = user_query(session, querydict)
            if len(users)>0:
                user0 = users[0]
                _id = user0['_id']
                grps = group_query(session)
                for i in grps:
                    if i.has_key('members') and _id in i['members']:
                        ret.append(i)
                ret = json.dumps(remove_mongo_id(ret), ensure_ascii=True, indent=4)
            else:
                ret = json.dumps({'result':u'user_group_get_user_not_exist'}, ensure_ascii=True, indent=4)

        else:
            ret = json.dumps({'result':u'user_group_get_one_user_required'}, ensure_ascii=True, indent=4)
        return ret

    def all_user_get(session, querydict):
        limit = 0
        skip = 0
        filter_str = ''
        if querydict.has_key('user_detail') and querydict['user_detail'] is True:
            user_detail = True
            del querydict['user_detail']
        if querydict.has_key('limit'):
            try:
                limit = int(querydict['limit'])
            except:
                pass
            del querydict['limit']
        if querydict.has_key('skip'):
            try:
                skip = int(querydict['skip'])
            except:
                pass
            del querydict['skip']

        if querydict.has_key('filter'):
            filter_str = querydict['filter']
            del querydict['filter']

        contactlist = user_query(session, {'username':{'$regex': '^.*' + filter_str + '.*$'}, 'limit':limit, 'skip':skip})
        ret = []
        keys = list(gWebSocketsMap.keys())
        for i in contactlist:
            for k in i.keys():
                if not k in ['_id', 'username', 'display_name', 'avatar']:
                    del i[k]
            if str(i['_id']) in keys:
                i['online_status'] = 'online'
            else:
                i['online_status'] = 'offline'
            ret.append(i)
        ret = json.dumps(remove_mongo_id(ret), ensure_ascii=True, indent=4)
        return ret


    def user_contact_get(session, querydict):
        ret = []
        app = aConfig['gConfig']['wsgi']['application']
        db, collection = get_collection(app, 'main', 'collection_users')
        q = {}
        if querydict.has_key('username'):
            if isinstance(querydict['username'], str) or isinstance(querydict['username'], unicode):
                q['username'] = querydict['username']
                del querydict['username']
        if querydict.has_key('_id'):
            if isinstance(querydict['_id'], str) or isinstance(querydict['_id'], unicode):
                q['_id'] = add_mongo_id(querydict['_id'])
                del querydict['_id']
        if len(list(q.keys()))>0:
            contacts = []
            selfid = None
            rec = collection.find_one(q)
            if rec and rec.has_key('contacts'):
                # contacts = rec['contacts']
                contacts = [add_mongo_id(i) for i in rec['contacts']]
                ret = contacts
                selfid = rec['_id']
            limit = 0
            skip = 0
            user_detail = False

            if querydict.has_key('user_detail') and querydict['user_detail'] is True:
                user_detail = True
                del querydict['user_detail']
            if querydict.has_key('limit'):
                try:
                    limit = int(querydict['limit'])
                except:
                    pass
                del querydict['limit']
            if querydict.has_key('skip'):
                try:
                    skip = int(querydict['skip'])
                except:
                    pass
                del querydict['skip']

            if user_detail:
                if querydict.has_key('filter'):
                    contactlist = user_query(session, {'username':{'$regex': '^.*' + querydict['filter'] + '.*$'}, '_id': {'$in':contacts, '$ne':selfid}, 'limit':limit, 'skip':skip})
                    del querydict['filter']
                else:
                    contactlist = user_query(session, {'_id':contacts, 'limit':limit, 'skip':skip})
                ret = []
                keys = list(gWebSocketsMap.keys())
                for i in contactlist:
                    if i.has_key('contacts'):
                        del i['contacts']
                    if i.has_key('password'):
                        del i['password']
                    if str(i['_id']) in keys:
                        i['online_status'] = 'online'
                    else:
                        i['online_status'] = 'offline'
                    ret.append(i)
            ret = json.dumps(remove_mongo_id(ret), ensure_ascii=True, indent=4)
        else:
            ret = json.dumps({'result':u'user_contact_query_one_user_required'}, ensure_ascii=True, indent=4)
        return ret

    def user_get(session, querydict):
        ret = ''
        rec = user_query(session, querydict)
        for i in rec:
            idx = rec.index(i)
            if i.has_key('contacts'):
                del i['contacts']
            if i.has_key('password'):
                del i['password']
            rec[idx] = i

        if len(rec)>0:
            ret = json.dumps(remove_mongo_id(rec), ensure_ascii=True, indent=4)
        else:
            ret = json.dumps({'result':u'query_no_record'}, ensure_ascii=True, indent=4)
        return ret

    def user_add(session, querydict):
        ret = ''
        app = aConfig['gConfig']['wsgi']['application']
        if querydict.has_key('username') and querydict.has_key('password') and len(querydict['username'])>0 and len(querydict['password'])>0:
            try:
                db, collection = get_collection(app, 'main', 'collection_users')
                existone = collection.find_one({'username':querydict['username']})
                if existone:
                    ret = json.dumps({'result':u'user_add_fail_username_already_exist'}, ensure_ascii=True, indent=4)
                else:
                    obj = {}
                    obj['username'] = querydict['username']
                    obj['display_name'] = querydict['username']
                    obj['password'] = querydict['password']
                    ts = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
                    obj['register_date'] = ts
                    obj['update_date'] = ts
                    obj['description'] = ''
                    obj['person_info'] = {}
                    obj['contacts'] = []
                    obj['avatar'] = None
                    if querydict.has_key('person_info') :
                        obj['person_info'] = querydict['person_info']
                    if querydict.has_key('contacts') and isinstance(querydict['contacts'], list):
                        obj['contacts'] = querydict['contacts']
                    if querydict.has_key('avatar') and len(querydict['avatar']) > 0:
                        obj['avatar'] = querydict['avatar']
                    _id = collection.save(add_mongo_id(obj))
                    rec = collection.find_one({'_id':_id})
                    ret = json.dumps(remove_mongo_id(rec), ensure_ascii=True, indent=4)
            except:
                if hasattr(sys.exc_info()[1], 'message'):
                    ret = json.dumps({'result':u'user_add_fail:%s' % sys.exc_info()[1].message}, ensure_ascii=True, indent=4)
                else:
                    ret = json.dumps({'result':u'user_add_fail' }, ensure_ascii=True, indent=4)
        else:
            ret = json.dumps({'result':u'user_add_fail_username_password_required'}, ensure_ascii=True, indent=4)
        return ret

    def user_update(session, querydict):
        ret = ''
        app = aConfig['gConfig']['wsgi']['application']
        if querydict.has_key('_id') and len(querydict['_id'])>0:
            try:
                _id = add_mongo_id(querydict['_id'])
                db, collection = get_collection(app, 'main', 'collection_users')
                existone = collection.find_one({'_id':_id})
                if existone:
                    del querydict['_id']
                    querydict['update_date'] = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
                    collection.update({'_id':existone['_id']}, {'$set': add_mongo_id(querydict)}, multi=False, upsert=False)
                    one = collection.find_one({'_id':_id})
                    ret = json.dumps(remove_mongo_id(one), ensure_ascii=True, indent=4)
                else:
                    ret = json.dumps({'result':u'user_update_user_not_exist'}, ensure_ascii=True, indent=4)
            except:
                if hasattr(sys.exc_info()[1], 'message'):
                    ret = json.dumps({'result':u'user_update_fail:%s' % sys.exc_info()[1].message}, ensure_ascii=True, indent=4)
                else:
                    ret = json.dumps({'result':u'user_update_fail' }, ensure_ascii=True, indent=4)
        else:
            ret = json.dumps({'result':u'user_update_fail_user_id_required'}, ensure_ascii=True, indent=4)
        return ret

    def user_remove(session, querydict):
        ret = ''
        app = aConfig['gConfig']['wsgi']['application']
        if querydict.has_key('_id') and len(querydict['_id'])>0:
            try:
                db, collection = get_collection(app, 'main', 'collection_users')
                existone = collection.find_one({'_id':add_mongo_id(querydict['_id'])})
                if existone:
                    collection.remove({'_id':existone['_id']})
                    ret = json.dumps(remove_mongo_id(existone), ensure_ascii=True, indent=4)
                else:
                    ret = json.dumps({'result':u'user_remove_user_not_exist'}, ensure_ascii=True, indent=4)
            except:
                if hasattr(sys.exc_info()[1], 'message'):
                    ret = json.dumps({'result':u'user_remove_fail:%s' % sys.exc_info()[1].message}, ensure_ascii=True, indent=4)
                else:
                    ret = json.dumps({'result':u'user_remove_fail' }, ensure_ascii=True, indent=4)
        else:
            ret = json.dumps({'result':u'user_remove_fail_user_id_required'}, ensure_ascii=True, indent=4)
        return ret


    def group_add(session, querydict):
        ret = ''
        app = aConfig['gConfig']['wsgi']['application']
        if querydict.has_key('owner_id')\
           and len(querydict['owner_id']) > 0\
           and querydict.has_key('group_name')\
           and len(querydict['group_name']) > 0:
            try:
                db, collection = get_collection(app, 'main', 'collection_groups')
                existone = collection.find_one({'group_name':querydict['group_name']})
                if existone:
                    ret = json.dumps({'result':u'group_add_fail_group_name_already_exist'}, ensure_ascii=True, indent=4)
                else:
                    obj = {}
                    obj['owner_id'] = querydict['owner_id']
                    obj['group_name'] = querydict['group_name']
                    ts = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
                    obj['found_date'] = ts
                    obj['update_date'] = ts
                    obj['members'] = [add_mongo_id(obj['owner_id']), ]
                    if querydict.has_key('avatar') and len(querydict['avatar']) > 0:
                        obj['avatar'] = querydict['avatar']
                    if querydict.has_key('description') and len(querydict['description']) > 0:
                        obj['description'] = querydict['description']
                    _id = collection.save(add_mongo_id(obj))
                    rec = collection.find_one({'_id':_id})
                    ret = json.dumps(remove_mongo_id(rec), ensure_ascii=True, indent=4)
            except:
                if hasattr(sys.exc_info()[1], 'message'):
                    ret = json.dumps({'result':u'group_add_fail:%s' % sys.exc_info()[1].message}, ensure_ascii=True, indent=4)
                else:
                    ret = json.dumps({'result':u'group_add_fail' }, ensure_ascii=True, indent=4)
        else:
            if not querydict.has_key('owner_id') or len(querydict['owner_id']) == 0:
                ret = json.dumps({'result':u'group_add_fail_owner_id_required'}, ensure_ascii=True, indent=4)
            if not querydict.has_key('group_name') or len(querydict['group_name']) == 0:
                ret = json.dumps({'result':u'group_add_fail_group_name_required'}, ensure_ascii=True, indent=4)
        return ret

    def group_update(session, querydict):
        ret = ''
        app = aConfig['gConfig']['wsgi']['application']
        if querydict.has_key('_id') and len(querydict['_id'])>0:
            try:
                _id = add_mongo_id(querydict['_id'])
                db, collection = get_collection(app, 'main', 'collection_groups')
                existone = collection.find_one({'_id':_id})
                if existone:
                    del querydict['_id']
                    querydict['update_date'] = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
                    collection.update({'_id':existone['_id']}, {'$set': add_mongo_id(querydict)}, multi=False, upsert=False)
                    one = collection.find_one({'_id':_id})
                    ret = json.dumps(remove_mongo_id(one), ensure_ascii=True, indent=4)
                else:
                    ret = json.dumps({'result':u'group_update_group_not_exist'}, ensure_ascii=True, indent=4)
            except:
                if hasattr(sys.exc_info()[1], 'message'):
                    ret = json.dumps({'result':u'group_update_fail:%s' % sys.exc_info()[1].message}, ensure_ascii=True, indent=4)
                else:
                    ret = json.dumps({'result':u'group_update_fail' }, ensure_ascii=True, indent=4)
        else:
            ret = json.dumps({'result':u'group_update_fail_group_id_required'}, ensure_ascii=True, indent=4)
        return ret

    def group_remove(session, querydict):
        ret = ''
        app = aConfig['gConfig']['wsgi']['application']
        if querydict.has_key('_id') and len(querydict['_id']) > 0:
            try:
                db, collection = get_collection(app, 'main', 'collection_groups')
                existone = collection.find_one({'_id':add_mongo_id(querydict['_id'])})
                if existone:
                    collection.remove({'_id':existone['_id']})
                    ret = json.dumps(remove_mongo_id(existone), ensure_ascii=True, indent=4)
                else:
                    ret = json.dumps({'result':u'group_remove_fail_group_not_exist'}, ensure_ascii=True, indent=4)
            except:
                if hasattr(sys.exc_info()[1], 'message'):
                    ret = json.dumps({'result':u'group_remove_fail:%s' % sys.exc_info()[1].message}, ensure_ascii=True, indent=4)
                else:
                    ret = json.dumps({'result':u'group_remove_fail' }, ensure_ascii=True, indent=4)
        else:
            ret = json.dumps({'result':u'group_remove_fail_found_group_id_required'}, ensure_ascii=True, indent=4)
        return ret


    def check_contact_exist(_id, alist):
        ret = None
        for i in alist:
            if i['_id'] == _id:
                ret = i
                break
        return ret


    def online(user_id, websocket):
        if user_id and websocket and not websocket.closed:
            if not gWebSocketsMap.has_key(user_id):
                gWebSocketsMap[user_id] = []
            if not websocket in gWebSocketsMap[user_id]:
                gWebSocketsMap[user_id].append(websocket)
    def offline(user_id):
        if user_id and gWebSocketsMap.has_key(user_id):
            for i in gWebSocketsMap[user_id]:
                i.close()
            del gWebSocketsMap[user_id]
            chat_save_log(aConfig, {
                'op':'chat/offline',
                'from':user_id,
                'timestamp':time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
            })

    def get_destination(session, from_id, _id):
        ret = []
        if isinstance(_id, str) or isinstance(_id, unicode):
            userlist = user_query(session, {'_id':from_id})
            if len(userlist)==0:
                userlist = user_query(session, {'username':from_id})
            if len(userlist)>0:
                user0 = userlist[0]
                if user0.has_key('contacts'):
                    toid = _id
                    try:
                        toid = ObjectId(_id)
                    except:
                        ul = user_query(session, {'username':_id})
                        if len(ul)>0:
                            toid = ul[0]['_id']
                    if add_mongo_id(str(toid)) in user0['contacts']:
                        ret.append(str(toid))
        elif isinstance(_id, list):
            userlist = user_query(session, {'_id':from_id})
            if len(userlist)==0:
                userlist = user_query(session, {'username':from_id})
            if len(userlist)>0:
                user0 = userlist[0]
                if user0.has_key('contacts'):
                    for id in _id:
                        if add_mongo_id(id) in user0['contacts']:
                            ret.append(id)
        return ret
    def get_destination_group(session, from_id, _id):
        ret = []
        userset = set()
        grps = group_query(session, {'_id':_id})
        for grp in grps:
            if grp.has_key('members') and len(grp['members'])>0:
                if add_mongo_id(from_id) in grp['members']:
                    userset = userset.union(set(grp['members']))
        userlist = list(userset)
        for id in userlist:
            ret.append(id)
        return ret

    def resend_offline_msg(session, to_id, limit=10):
        app = aConfig['gConfig']['wsgi']['application']
        db, collection = get_collection(app, 'main', 'collection_chat_log_offline')
        arr = list(collection.find({'to':add_mongo_id(to_id)}).limit(limit).sort('timestamp', pymongo.DESCENDING))
        ids = [i['_id'] for i in arr]
        collection.remove({'_id':{'$in': ids}})
        for i in arr:
            gJoinableQueue.put(remove_mongo_id(i))


    def chat(session, websocket, obj={}):
        tolist = []
        if obj.has_key('from') and len(obj['from'])>0 and obj.has_key('msg') and len(obj['msg'])>0:
            if obj.has_key('to') and len(obj['to'])>0:
                tolist = get_destination(session,  obj['from'], obj['to'])
            if obj.has_key('to_group') and len(obj['to_group']) > 0:
                tolist = get_destination_group(session, obj['from'], obj['to_group'])
            for k in tolist:
                try:
                    d  = {'op': 'chat/chat', 'from': obj['from'], 'to': k, 'timestamp': time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), 'msg': obj['msg']}
                    gJoinableQueue.put(d)
                except gevent.queue.Full:
                    print('chat queue is full')

    def request_response(session, websocket, obj={}):
        #'chat/request/contact/add',
        #'chat/request/contact/remove',
        #'chat/response/contact/add/accept',
        #'chat/response/contact/add/reject'
        #'chat/request/group/join'
        #'chat/request/group/quit'
        #'chat/response/group/join/accept',
        #'chat/response/group/join/reject',
        tolist = []
        app = aConfig['gConfig']['wsgi']['application']
        try:
            if obj['op'] == 'chat/response/contact/add/accept':
                if obj.has_key('from') and len(obj['from'])>0 and obj.has_key('to') and len(obj['to'])>0:
                    db, collection = get_collection(app, 'main','collection_users')
                    userlist = user_query(session, {'_id':[obj['from'],  obj['to']]})
                    for user in userlist:
                        if str(user['_id']) == obj['from'] and not add_mongo_id(obj['to']) in user['contacts']:
                            user['contacts'].append(add_mongo_id(obj['to']))
                        if str(user['_id']) == obj['to'] and not add_mongo_id(obj['from']) in user['contacts']:
                            user['contacts'].append(add_mongo_id(obj['from']))
                        user['update_date'] = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
                        collection.save(user)

                    fromuser = {}
                    fromuser['op'] = obj['op']
                    fromuser['_id'] = obj['from']
                    fromuser['from'] = obj['to']
                    fromuser['to'] = obj['from']
                    fromuser['contacts'] = json.loads(user_contact_get(session, {'_id':obj['from'],'user_detail':True}))
                    gJoinableQueue.put(remove_mongo_id(fromuser))

                    touser = {}
                    touser['op'] = obj['op']
                    touser['_id'] = obj['to']
                    touser['from'] = obj['from']
                    touser['to'] = obj['to']
                    touser['contacts'] = json.loads(user_contact_get(session, {'_id':obj['to'],'user_detail':True}))
                    gJoinableQueue.put(remove_mongo_id(touser))

            elif obj['op'] == 'chat/response/contact/add/reject':
                if obj.has_key('from') and len(obj['from'])>0 and obj.has_key('to') and len(obj['to'])>0:
                    userlist = user_query(session, {'_id':obj['from']})
                    if len(userlist)>0:
                        user0 = userlist[0]
                        user0['op'] = obj['op']
                        user0['from'] = obj['from']
                        user0['to'] = obj['to']
                        if user0.has_key('password'):
                            del user0['password']
                        if user0.has_key('contacts'):
                            del user0['contacts']
                        if obj.has_key('reject_reason') and len(obj['reject_reason'])>0:
                            user0['reject_reason'] = obj['reject_reason']
                        gJoinableQueue.put(remove_mongo_id(user0))
            elif obj['op'] == 'chat/request/contact/add':
                if obj.has_key('from') and len(obj['from'])>0 and obj.has_key('to') and len(obj['to'])>0:
                    userlist = user_query(session, {'_id':obj['from']})
                    if len(userlist)>0:
                        user0 = userlist[0]
                        user0['op'] = obj['op']
                        user0['from'] = obj['from']
                        user0['to'] = obj['to']
                        if user0.has_key('password'):
                            del user0['password']
                        if user0.has_key('contacts'):
                            del user0['contacts']
                        gJoinableQueue.put(remove_mongo_id(user0))

            elif obj['op'] == 'chat/request/contact/remove':
                if obj.has_key('from') and len(obj['from'])>0 and obj.has_key('to') and len(obj['to'])>0:
                    db, collection = get_collection(app, 'main', 'collection_users')
                    userlist = user_query(session, {'_id':[obj['from'],  obj['to']]})
                    remover, removee = None, None
                    for user in userlist:
                        if str(user['_id']) == obj['from'] and add_mongo_id(obj['to']) in user['contacts']:
                            user['contacts'].remove(add_mongo_id(obj['to']))
                            remover = user['display_name']
                        if str(user['_id']) == obj['to'] and add_mongo_id(obj['from']) in user['contacts']:
                            user['contacts'].remove(add_mongo_id(obj['from']))
                            removee = user['display_name']
                        user['update_date'] = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
                        collection.save(user)

                    fromuser = {}
                    fromuser['op'] = obj['op']
                    fromuser['_id'] = obj['from']
                    fromuser['from'] = obj['to']
                    fromuser['to'] = obj['from']
                    fromuser['remover'] = remover
                    fromuser['removee'] = removee
                    fromuser['remove_type'] = 'remover'
                    fromuser['contacts'] = json.loads(user_contact_get(session, {'_id':obj['from'], 'user_detail':True}))
                    gJoinableQueue.put(remove_mongo_id(fromuser))

                    touser = {}
                    touser['op'] = obj['op']
                    touser['_id'] = obj['to']
                    touser['from'] = obj['from']
                    touser['to'] = obj['to']
                    touser['remover'] = remover
                    touser['removee'] = removee
                    touser['remove_type'] = 'removee'
                    touser['contacts'] = json.loads(user_contact_get(session, {'_id':obj['to'], 'user_detail':True}))
                    gJoinableQueue.put(remove_mongo_id(touser))

            elif obj['op'] == 'chat/request/group/join':
                if obj.has_key('from') and len(obj['from'])>0 and obj.has_key('to_group') and len(obj['to_group'])>0:
                    grps = group_query(session, {'_id':obj['to_group']})
                    if len(grps)>0:
                        grp0 = grps[0]
                        userlist = user_query(session, {'_id':obj['from']})
                        if len(userlist)>0:
                            user0 = userlist[0]
                            user0['op'] = obj['op']
                            user0['from'] = obj['from']
                            user0['request_src'] = obj['from']
                            user0['to_group'] = obj['to_group']
                            user0['to'] = grp0['owner_id']
                            if user0.has_key('password'):
                                del user0['password']
                            if user0.has_key('contacts'):
                                del user0['contacts']
                            gJoinableQueue.put(remove_mongo_id(user0))
            elif obj['op'] == 'chat/request/group/quit':
                if obj.has_key('from') and len(obj['from'])>0 and obj.has_key('to_group') and len(obj['to_group'])>0:
                    grps = group_query(session, {'_id':obj['to_group']})
                    if len(grps)>0:
                        grp0 = grps[0]
                        members = []
                        if add_mongo_id(obj['from']) in grp0['members']:
                            grp0['members'].remove(add_mongo_id(obj['from']))
                            members = [str(i) for i in grp0['members']]
                            db, collection = get_collection(app, 'main', 'collection_groups')
                            collection.save(grp0)
                            broadcast(session, websocket, members, {'op':obj['op'], 'from':obj['from'], 'to_group':obj['to_group']}  )
            elif obj['op'] == 'chat/response/group/join/accept':
                if obj.has_key('to_group') and len(obj['to_group'])>0 and obj.has_key('request_src') and len(obj['request_src'])>0:
                    grps = group_query(session, {'_id': obj['to_group']})
                    if len(grps)>0:
                        grp0 = grps[0]
                        if not add_mongo_id(obj['request_src']) in grp0['members']:
                            grp0['members'].append(add_mongo_id(obj['request_src']))
                            db, collection = get_collection(app, 'main', 'collection_groups')
                            collection.save(grp0)
                            members = [str(i) for i in grp0['members']]
                            broadcast(session, websocket, members, obj)
            elif obj['op'] == 'chat/response/group/join/reject':
                if obj.has_key('from') and len(obj['from'])>0 and obj.has_key('to') and len(obj['to'])>0 and obj.has_key('to_group') and len(obj['to_group'])>0:
                    userlist = user_query(session, {'_id':obj['from']})
                    if len(userlist)>0:
                        user0 = userlist[0]
                        user0['op'] = obj['op']
                        user0['from'] = obj['from']
                        user0['to'] = obj['to']
                        user0['to_group'] = obj['to_group']
                        if user0.has_key('password'):
                            del user0['password']
                        if user0.has_key('contacts'):
                            del user0['contacts']
                        if obj.has_key('reject_reason') and len(obj['reject_reason'])>0:
                            user0['reject_reason'] = obj['reject_reason']
                        gJoinableQueue.put(remove_mongo_id(user0))
        except gevent.queue.Full:
            print('chat queue is full')

    def broadcast(session, websocket, alist, obj={}):
        for i in alist:
            d = {}
            for k in obj.keys():
                d[k] = obj[k]
            if isinstance(i, str) :
                d['to'] = i
            elif isinstance(i, dict):
                if '_id' in i:
                    d['to'] = i['_id']
            try:
                gJoinableQueue.put(d)
            except:
                pass


    def handle_websocket(environ, session):
        ws = get_websocket(environ)
        app = aConfig['gConfig']['wsgi']['application']
        interval = 1.0
        try:
            interval = float(aConfig['gConfig']['applications'][app]['websocket']['interval_poll'])
        except:
            interval = 1.0
        while ws and not ws.closed:
            obj = ws_recv(environ)
            if obj and isinstance(obj, dict) and obj.has_key('op'):
                if obj['op'] == 'queue_size':
                    qsize = 0
                    if gJoinableQueue:
                        qsize = gJoinableQueue.qsize()
                    ws.send(json.dumps({'queue_size':qsize}, ensure_ascii=True, indent=4))
                elif obj['op'] == 'chat/online':
                    rec = []
                    if obj.has_key('_id') and len(obj['_id'])>0:
                        rec = user_query(session, {'_id':obj['_id']})
                    elif obj.has_key('username') and len(obj['username'])>0:
                        rec = user_query(session, {'username':obj['username']})
                    if len(rec)>0:
                        r0 = rec[0]
                        _id = str(r0['_id'])
                        online(_id, ws)
                        r0['contacts'] = json.loads(user_contact_get(session, {'_id':_id,'user_detail':True}))
                        r0['groups'] = json.loads(user_group_get(session, {'_id':_id,'user_detail':True}))
                        d = remove_mongo_id(r0)
                        d['op'] = obj['op']
                        d['from'] = _id
                        d['to'] = _id
                        d['timestamp'] = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
                        gJoinableQueue.put(d)
                        #ws.send(json.dumps(d, ensure_ascii=True, indent=4))
                        if obj.has_key('inform_contact') and obj['inform_contact'] is True:
                            other_contacts = list(gWebSocketsMap.keys())[:]
                            if _id in other_contacts:
                                other_contacts.remove(_id)
                            broadcast(session, ws, other_contacts, {'op':'chat/info/online','from':_id})
                        limit = 10
                        if aConfig['gConfig']['applications'][app].has_key('resend') and  aConfig['gConfig']['applications'][app]['resend'].has_key('max_resend_record_num'):
                            try:
                                limit = int(aConfig['gConfig']['applications'][app]['resend']['max_resend_record_num'])
                            except:
                                pass
                        resend_offline_msg(session, _id, limit)
                    else:
                        ws.send(json.dumps({'result':'chat_online_user_not_exist'}, ensure_ascii=True, indent=4))
                elif obj['op'] == 'chat/offline':
                    if obj.has_key('_id'):
                        _id = obj['_id']
                        if obj.has_key('inform_contact') and obj['inform_contact'] is True:
                            other_contacts = list(gWebSocketsMap.keys())[:]
                            if _id in other_contacts:
                                other_contacts.remove(_id)
                            broadcast(session, ws, other_contacts,  {'op':'chat/info/offline','from':_id, 'timestamp': time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())})
                        offline(_id)
                    elif obj.has_key('username'):
                        rec = user_query(session, {'username':obj['username']})
                        if len(rec)>0:
                            _id = str(rec[0]['_id'])
                            if obj.has_key('inform_contact') and obj['inform_contact'] is True:
                                other_contacts = list(gWebSocketsMap.keys())[:]
                                if _id in other_contacts:
                                    other_contacts.remove(_id)
                                broadcast(session, ws, other_contacts, {'op':'chat/info/offline','from':_id})
                            offline(_id)
                        else:
                            ws.send(json.dumps({'result':'chat_offline_user_not_exist'}, ensure_ascii=True, indent=4))
                    else:
                        ws.send(json.dumps({'result':'chat_offline_username_or_id_required'}, ensure_ascii=True, indent=4))
                elif obj['op'] == 'chat/chat':
                    chat(session, ws, obj)
                elif 'chat/request' in obj['op'] or 'chat/response' in obj['op']:
                    request_response(session, ws, obj)
            else:
                try:
                    ws.send('')
                except:
                    _id = None
                    for k in gWebSocketsMap.keys():
                        if ws in gWebSocketsMap[k] :
                            _id = k
                            break
                    if _id:
                        print('websocket[%s] is closed2' % _id)
                        offline(_id)
                        broadcast(session, None, gWebSocketsMap.keys(), {'op':'chat/info/offline', 'from':_id})
            gevent.sleep(interval)
        if ws and ws.closed:
            del ws

    def check_url_token(querydict):
        is_token_pass = False
        enable_url_md5_check = False
        md5prefix = ''
        app = aConfig['gConfig']['wsgi']['application']
        if aConfig['gConfig']['applications'][app].has_key('security') \
           and aConfig['gConfig']['applications'][app]['security'].has_key('md5prefix'):
            md5prefix = str(aConfig['gConfig']['applications'][app]['security']['md5prefix'])

        if aConfig['gConfig']['applications'][app].has_key('security') \
           and aConfig['gConfig']['applications'][app]['security'].has_key('enable_url_md5_check') \
           and aConfig['gConfig']['applications'][app]['security']['enable_url_md5_check'].lower() == 'true':
            enable_url_md5_check = True
        else:
            is_token_pass = True
        if enable_url_md5_check:
            print('checking token...')
            if querydict.has_key('_token'):
                plain = '%s_|_%s' % (md5prefix, time.strftime('%Y%m%d%H'))
                token = hashlib.md5.new(plain).hexdigest()
                if token == str(querydict['_token']):
                    is_token_pass = True
        return is_token_pass

    def chat_broadcast(session, querydict):
        ret = '{}'
        tolist = []
        if querydict.has_key('from') and len(querydict['from'])>0:
            if querydict.has_key('to'):
                if isinstance(querydict['to'], str) or isinstance(querydict['to'], unicode):
                    tolist.append(querydict['to'])
                if isinstance(querydict['to'], list):
                    tolist.extend(querydict['to'])
            else:
                ret = json.dumps({'result':u'chat_broadcast_to_required'}, ensure_ascii=True, indent=4)
        else:
            ret = json.dumps({'result':u'chat_broadcast_from_required'}, ensure_ascii=True, indent=4)
        if querydict.has_key('msg') and len(querydict['msg'])>0:
            for k in tolist:
                try:
                    d  = {'op': 'chat/chat', 'from': querydict['from'], 'to': k, 'timestamp': time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), 'msg': querydict['msg']}
                    gJoinableQueue.put(d)
                except gevent.queue.Full:
                    print('chat queue is full')
                    ret = json.dumps({'result':u'chat queue is full'}, ensure_ascii=True, indent=4)
        else:
            ret = json.dumps({'result':u'chat_broadcast_msg_required'}, ensure_ascii=True, indent=4)
        return ret

    def chat_log_query(session, querydict):
        limit = 0
        skip = 0
        filter_str = ''
        from_id, to_id = None, None
        if querydict.has_key('from') and (isinstance(querydict['from'], str) or isinstance(querydict['from'], unicode)) and len(querydict['from'])>0:
            from_id = querydict['from']
        if querydict.has_key('to') and (isinstance(querydict['to'], str) or isinstance(querydict['to'], unicode)) and len(querydict['to'])>0:
            to_id = querydict['to']
        if from_id is None or to_id is None:
            return json.dumps({'result':u'chat_log_query_from_and_to_required'}, ensure_ascii=True, indent=4)
        if querydict.has_key('limit'):
            try:
                limit = int(querydict['limit'])
            except:
                pass
            del querydict['limit']
        if querydict.has_key('skip'):
            try:
                skip = int(querydict['skip'])
            except:
                pass
            del querydict['skip']

        if querydict.has_key('filter'):
            filter_str = querydict['filter']
            del querydict['filter']


        db, collection1 = get_collection(app, 'main', 'collection_chat_log')
        ret = list(collection1.find({'$or':[{'from':add_mongo_id(from_id), 'to':add_mongo_id(to_id)}, {'to':add_mongo_id(from_id), 'from':add_mongo_id(to_id)}]}).limit(limit).skip(skip).sort('timestamp', pymongo.DESCENDING))
        ret = json.dumps(remove_mongo_id(ret), ensure_ascii=True, indent=4)
        return ret

    def chat_log_remove(session, querydict):
        return ''





    headers = {}
    hh = {}
    headers['Content-Type'] = 'text/json;charset=' + ENCODING
    statuscode = '200 OK'
    body = ''
    app = aConfig['gConfig']['wsgi']['application']
    urllist = []
    for key in aConfig['gConfig']['applications'][app]['url_mapping'].keys():
        urllist.append(Rule(str(key), endpoint=str(aConfig['gConfig']['applications'][app]['url_mapping'][key])))
    urlmap = Map(urllist, converters={'bool': BooleanConverter})
    urls = urlmap.bind_to_environ(environ)
    querydict, buf, stream = get_querydict_by_GET_POST(aConfig, environ)
    endpoint = ''
    try:
        endpoint, args = urls.match()
        if endpoint == 'handle_index':
            statuscode, headers, body = handle_index(environ, session)
        elif endpoint == 'user_remove':
            body = user_remove(session, querydict)
        elif endpoint == 'user_get':
            body = user_get(session, querydict)
        elif endpoint == 'user_add':
            body = user_add(session, querydict)
        elif endpoint == 'all_user_get':
            body = all_user_get(session, querydict)
        elif endpoint == 'user_update':
            body = user_update(session, querydict)
        elif endpoint == 'group_add':
            body = group_add(session, querydict)
        elif endpoint == 'group_get':
            body = group_get(session, querydict)
        elif endpoint == 'user_group_get':
            body = user_group_get(session, querydict)
        elif endpoint == 'user_contact_get':
            body = user_contact_get(session, querydict)
        elif endpoint == 'group_update':
            body = group_update(session, querydict)
        elif endpoint == 'group_remove':
            body = group_remove(session, querydict)
        elif endpoint == 'handle_websocket':
            handle_websocket(environ, session)
        else:
            body = json.dumps({'result':u'access_deny'}, ensure_ascii=True, indent=4)

    # except HTTPException, e:
    except Exception as e:
        body = json.dumps({'result':u'access_deny'}, ensure_ascii=True, indent=4)

    if session:
        aConfig['gSessionStore'].save(session)
    for k in hh.keys():
        headers[k] = hh[k]
    return statuscode, headers, body
Example #4
0
def handle_url(aConfig, environ, session):
    global gWebSocketsClientMap, gMavlinkRedirectServer, gClientAddress

    # def ws_main_online(websocket, user_id):
    #     global gWebSocketsClientMap
    #     if websocket and not websocket.closed:
    #         v = str(websocket.__hash__())
    #         if not 'main' in gWebSocketsClientMap:
    #             gWebSocketsClientMap['main'] = {}
    #         if not v in gWebSocketsClientMap['main']:
    #             gWebSocketsClientMap['main'][v] = {'ws':websocket, 'user_id':user_id}

    def ws_mavlink_online(websocket, user_id):
        global gWebSocketsClientMap
        if websocket and not websocket.closed:

            v = str(websocket.__hash__())
            if not 'mavlink' in gWebSocketsClientMap:
                gWebSocketsClientMap['mavlink'] = {}
            if not v in gWebSocketsClientMap['mavlink']:
                gWebSocketsClientMap['mavlink'][v] = {'ws':websocket, 'user_id':user_id}


    # def ws_offline_main(websocket):
    #     global gWebSocketsClientMap
    #     v = str(websocket.__hash__())
    #     websocket.close()
    #     if 'main' in gWebSocketsClientMap and v in gWebSocketsClientMap['main']:
    #         del gWebSocketsClientMap['main'][v]

    def ws_mavlink_offline(websocket):
        global gWebSocketsClientMap, gListenLoopList
        v = str(websocket.__hash__())
        websocket.close()
        if 'mavlink' in gWebSocketsClientMap and v in gWebSocketsClientMap['mavlink']:
            del gWebSocketsClientMap['mavlink'][v]
        m = _.find(gListenLoopList, {'ws_hash': v})
        if m:
            m['greenlet'].kill()
            gListenLoopList.remove(m)



    # def handle_websocket_main(environ, session, user_id):
    #     if session:
    #         ws = get_websocket(environ)
    #         ws_main_online(ws, user_id)
    #         app = aConfig['gConfig']['wsgi']['application']
    #         interval = 1
    #         try:
    #             interval = float(aConfig['gConfig']['applications'][app]['websocket']['interval_poll_client'])
    #         except:
    #             interval = 1
    #         while ws and not ws.closed:
    #             try:
    #                 ws.send('')
    #             except:
    #                 ws_offline_main(ws)
    #                 break
    #             gevent.sleep(interval)

    def create_ws_recv_loop(aConfig, ws):
        global gWebSocketsClientMap, gMavlinkRedirectServer, gClientAddress
        while ws and not ws.closed:
            try:
                data = ws.receive()
                if data and len(data):
                    if gMavlinkRedirectServer and gClientAddress:
                        # print('send %d byte to mavproxy...' % len(data))
                        gMavlinkRedirectServer.socket.sendto(data, gClientAddress)
            except geventwebsocket.WebSocketError as e:
                # raise e
                print('create_ws_recv_loop WebSocketError:', e)
            except Exception as e:
                raise e
                print('create_ws_recv_loop Exception:', e)
            gevent.sleep(0.001)

    def handle_websocket_data(environ, session, user_id):
        global gListenLoopList
        ws = get_websocket(environ)
        ws_mavlink_online(ws, user_id)
        v = str(ws.__hash__())
        m = _.find(gListenLoopList, {'ws_hash': v})
        if m is None:
            g = gevent.spawn(create_ws_recv_loop, aConfig, ws)
            gListenLoopList.append({'ws_hash':v, 'greenlet':g})

        app = aConfig['gConfig']['wsgi']['application']
        interval = 10
        try:
            interval = float(aConfig['gConfig']['applications'][app]['websocket']['interval_poll_mavlink'])
        except:
            interval = 10
        while ws and not ws.closed:
            try:
                # ws.send(str.encode('', encoding=ENCODING), binary=True)
                ws.send('', binary=True)
            except:
                ws_mavlink_offline(ws)
                break
            gevent.sleep(interval)


    # def save_to_log(device_id, queue):
    #     app = aConfig['gConfig']['wsgi']['application']
    #     today = datetime.datetime.now().strftime("%Y%m%d")
    #     collection_name = 'sensor_log_%s_%s' % (device_id, today)
    #     if 'sensor_log' in aConfig['gConfig']['applications'][app]['database']['mongodb']:
    #         db, collection = get_collection(aConfig, app, 'sensor_log',  collection_name)
    #         collection.insert_many(queue.queue)
    #         queue.queue.clear()



    def handle_index(environ, session):
        statuscode, mimetype, body = 403, 'text/plain', 'Access deny'
        return statuscode, mimetype, body

    def handle_logout(session):
        statuscode, mimetype, body = 200, 'text/json',  ''
        if session:
            aConfig['gSessionStore'].delete(session)
            body = json.dumps({'result':u'ok'}, ensure_ascii=True, indent=4)
        else:
            body = json.dumps({'result':u'403 Fobbiden'}, ensure_ascii=True, indent=4)
        return statuscode, mimetype, body

    def handle_login(session, querydict):
        def get_user(querydict):
            ret = None
            if 'username' in querydict and 'password' in querydict:
                app = aConfig['gConfig']['wsgi']['application']
                db, collection = get_collection(aConfig, app, 'main', 'collection_users')
                if check_is_mobile_phone_number(querydict['username']):
                    ret = collection.find_one({'password':querydict['password'],'mobile_phone':querydict['username']})
                elif check_is_mail_addr(querydict['username']):
                    ret = collection.find_one({'password':querydict['password'],'mail_addr':querydict['username']})
                else:
                    ret = collection.find_one({'password':querydict['password'],'username':querydict['username']})
            return ret
        statuscode, mimetype, body = 200, 'text/json',  ''
        # header = {}
        user = get_user(querydict)
        if session and user:
            user = remove_mongo_id(user)
            sess = aConfig['gSessionStore'].session_class(user, session.sid, False)
            for k in user.keys():
                sess[k] = user[k]
            if 'password' in sess:
                del sess['password']
            aConfig['gSessionStore'].save_if_modified(sess)
            if 'callback_jsonp' in querydict:
                body = "%s('%s')" % (querydict['callback_jsonp'], json.dumps(sess, ensure_ascii=True))
            else:
                body = '_cookie_' + json.dumps(sess, ensure_ascii=True, indent=4)
        else:
            body = json.dumps({'result':u'用户名或密码错误'}, ensure_ascii=True, indent=4)
        return statuscode, mimetype, body

    def check_permission(user_id, action):
        return True


    user_id = None
    if session and '_id' in session:
        user_id = session['_id']
    statuscode, mimetype, body = 200, 'text/json',  '{}'
    app = aConfig['gConfig']['wsgi']['application']
    urllist = []
    for key in aConfig['gConfig']['applications'][app]['url_mapping'].keys():
        urllist.append(Rule(key, endpoint=aConfig['gConfig']['applications'][app]['url_mapping'][key]))
    urlmap = Map(urllist, converters={'bool': BooleanConverter})
    urls = urlmap.bind_to_environ(environ)
    querydict, buf, stream = get_querydict_by_GET_POST(environ)
    try:
        endpoint, args = urls.match()
        if endpoint == 'handle_index':
            statuscode, mimetype, body = handle_index(environ, session)
        elif endpoint == 'handle_login':
            statuscode, mimetype, body = handle_login(session, querydict)
        elif endpoint == 'handle_logout':
            statuscode, mimetype, body = handle_logout(session)
        # elif endpoint == 'handle_websocket_main':
        #     handle_websocket_main(environ, session, user_id)
        elif endpoint == 'handle_websocket_data':
            handle_websocket_data(environ, session, user_id)
        else:
            body = json.dumps({'result':u'access_deny'}, ensure_ascii=True, indent=4)

    # except HTTPException, e:
    except Exception as e:
        traceback.print_exc()
        body = json.dumps({'result':u'error:%s' % e.message}, ensure_ascii=True, indent=4)

    # if session:
    #     aConfig['gSessionStore'].save(session)
    # for k in hh.keys():
    #     headers[k] = hh[k]
    return statuscode, mimetype, body
Example #5
0
def handle_url(aConfig, environ, session):
    global gWebSocketsClientMap, gWebSocketsAgentMap,  gTileCache, gSubscriptionList, gSensorControlList,  gSerialIdMapping, gServiceFlags

    def ws_main_online(websocket, user_id):
        global gWebSocketsClientMap
        if websocket and not websocket.closed:
            v = str(websocket.__hash__())
            if not 'main' in gWebSocketsClientMap:
                gWebSocketsClientMap['main'] = {}
            if not v in gWebSocketsClientMap['main']:
                gWebSocketsClientMap['main'][v] = {'ws':websocket, 'user_id':user_id}

    # def ws_mavlink_online(websocket, user_id):
    #     global gWebSocketsClientMap
    #     if websocket and not websocket.closed:
    #         v = str(websocket.__hash__())
    #         if not 'mavlink' in gWebSocketsClientMap:
    #             gWebSocketsClientMap['mavlink'] = {}
    #         if not v in gWebSocketsClientMap['mavlink']:
    #             gWebSocketsClientMap['mavlink'][v] = {'ws':websocket, 'user_id':user_id}


    def ws_main_offline(websocket):
        global gWebSocketsClientMap
        v = str(websocket.__hash__())
        websocket.close()
        if 'main' in gWebSocketsClientMap and v in gWebSocketsClientMap['main']:
            del gWebSocketsClientMap['main'][v]

    # def ws_mavlink_offline(websocket):
    #     global gWebSocketsClientMap
    #     v = str(websocket.__hash__())
    #     websocket.close()
    #     if 'mavlink' in gWebSocketsClientMap and v in gWebSocketsClientMap['mavlink']:
    #         del gWebSocketsClientMap['mavlink'][v]


    def handle_websocket_client(environ, session, user_id):
        if session:
            ws = get_websocket(environ)
            ws_main_online(ws, user_id)
            app = aConfig['gConfig']['wsgi']['application']
            interval = 1
            try:
                interval = float(aConfig['gConfig']['applications'][app]['websocket']['interval_poll_client'])
            except:
                interval = 1
            while ws and not ws.closed:
                try:
                    ws.send('', binary=False)
                except Exception as e:
                    # raise e
                    ws_main_offline(ws)
                    break
                gevent.sleep(interval)

    # def handle_websocket_mavlink(environ, session, user_id):
    #     if session:
    #         ws = get_websocket(environ)
    #         ws_mavlink_online(ws, user_id)
    #         app = aConfig['gConfig']['wsgi']['application']
    #         interval = 10
    #         try:
    #             interval = float(aConfig['gConfig']['applications'][app]['websocket']['interval_poll_mavlink'])
    #         except:
    #             interval = 10
    #         while ws and not ws.closed:
    #             try:
    #                 ws.send('', binary=True)
    #             except:
    #                 ws_mavlink_offline(ws)
    #                 break
    #             gevent.sleep(interval)


    # def save_to_log(device_id, queue):
    #     app = aConfig['gConfig']['wsgi']['application']
    #     today = datetime.datetime.now().strftime("%Y%m%d")
    #     collection_name = 'sensor_log_%s_%s' % (device_id, today)
    #     if 'sensor_log' in aConfig['gConfig']['applications'][app]['database']['mongodb']:
    #         db, collection = get_collection(aConfig, app, 'sensor_log',  collection_name)
    #         collection.insert_many(queue.queue)
    #         queue.queue.clear()



    def handle_index(environ, session):
        app = aConfig['gConfig']['wsgi']['application']
        if session and 'username' in session:
            statuscode, mimetype, body =  handle_static(aConfig, environ, aConfig['gConfig']['applications'][app]['static']['page']['indexpage'])
        else:
            statuscode, mimetype, body =  handle_static(aConfig, environ, aConfig['gConfig']['applications'][app]['static']['page']['unauthorizedpage'])
            statuscode = 401
        return statuscode, mimetype, body

    def handle_logout(session):
        statuscode, mimetype, body = 200, 'text/json',  ''
        if session:
            aConfig['gSessionStore'].delete(session)
            body = json.dumps({'result':'ok'}, ensure_ascii=True, indent=4)
        else:
            body = json.dumps({'result':'403 Fobbiden'}, ensure_ascii=True, indent=4)
        return statuscode, mimetype, body

    def handle_login(session, querydict):
        def get_user(querydict):
            ret = None
            if 'username' in querydict and 'password' in querydict:
                app = aConfig['gConfig']['wsgi']['application']
                db, collection = get_collection(aConfig, app, 'main', 'collection_users')
                if check_is_mobile_phone_number(querydict['username']):
                    ret = collection.find_one({'password':querydict['password'],'mobile_phone':querydict['username']})
                elif check_is_mail_addr(querydict['username']):
                    ret = collection.find_one({'password':querydict['password'],'mail_addr':querydict['username']})
                else:
                    ret = collection.find_one({'password':querydict['password'],'username':querydict['username']})
            return ret
        statuscode, mimetype, body = 200, 'text/json',  ''
        # header = {}
        user = get_user(querydict)
        if session and user:
            user = remove_mongo_id(user)
            sess = aConfig['gSessionStore'].session_class(user, session.sid, False)
            for k in user:
                sess[k] = user[k]
            if 'password' in sess:
                del sess['password']
            aConfig['gSessionStore'].save_if_modified(sess)
            if 'callback_jsonp' in querydict:
                body = "%s('%s')" % (querydict['callback_jsonp'], json.dumps(sess, ensure_ascii=True))
            else:
                body = '_cookie_' + json.dumps(sess, ensure_ascii=True, indent=4)
        else:
            body = json.dumps({'result':'用户名或密码错误'}, ensure_ascii=True, indent=4)
        return statuscode, mimetype, body

    def check_permission(user_id, action):
        return True


    def handle_query_feature(session, aConfig, querydict, user_id):
        statuscode, mimetype, body = 200, 'text/json', '{}'
        app = aConfig['gConfig']['wsgi']['application']
        db, collection = get_collection(aConfig, app, 'main', 'collection_features')
        limit = 100
        if 'limit' in querydict and isinstance(querydict['limit'], int):
            limit = querydict['limit']
        cond = {}
        if 'name' in querydict:
            cond['$or'] = [
                {
                    'properties.name': {'$regex': '^.*' + querydict['name'] + '.*$'}
                },
                {
                    'properties.py': {'$regex': '^.*' + querydict['name'] + '.*$'}
                }]
        if 'webgis_type' in querydict:
            if isinstance(querydict['webgis_type'], str) :
                cond['properties.webgis_type'] = add_mongo_id(querydict['webgis_type'])
            elif isinstance(querydict['webgis_type'], list):
                cond['properties.webgis_type'] = {'$in': add_mongo_id(querydict['webgis_type'])}
        if 'tower_id' in querydict:
            if isinstance(querydict['tower_id'], str) :
                cond['_id'] = add_mongo_id(querydict['tower_id'])
            elif isinstance(querydict['tower_id'], list):
                cond['_id'] = {'$in':add_mongo_id(querydict['tower_id'])}
        arr = remove_mongo_id(list(collection.find(cond).limit(limit)))
        return statuscode, mimetype, json.dumps(arr, ensure_ascii=True, indent=4)

    def get_device_from_tower(session, aConfig, tower_id):
        ret = None
        app = aConfig['gConfig']['wsgi']['application']
        db, collection = get_collection(aConfig, app, 'main', 'collection_tower_device_bind')
        if isinstance(tower_id, str) :
            one = collection.find_one({'tower_id':add_mongo_id(tower_id)})
            if one:
                ret = remove_mongo_id(one['device_id'])
        elif isinstance(tower_id, list):
            arr = _.pluck(list(collection.find({'tower_id':{'$in':add_mongo_id(tower_id)}})), 'device_id')
            ret = remove_mongo_id(arr)
        return ret






    def handle_geo_near(session, aConfig, querydict, user_id):
        def calc_dist(p1,  p2):
            po1 = tuple((p1[1], p1[0]))
            po2 = tuple((p2[1], p2[0]))
            return int(great_circle(po1, po2).m)

        statuscode, mimetype, body = 200, 'text/json', '{}'
        app = aConfig['gConfig']['wsgi']['application']
        db, collection = get_collection(aConfig, app, 'main', 'collection_features')
        limit = 100
        if 'limit' in querydict and isinstance(querydict['limit'], int):
            limit = querydict['limit']
        if 'geometry' in querydict:
            geojsonobj = querydict['geometry']
            if isinstance(geojsonobj, str) :
                try:
                    geojsonobj = json.loads(geojsonobj)
                except:
                    geojsonobj = {}
            if 'type' in geojsonobj:
                cond = {'geometry2d': {'$nearSphere': {'$geometry': geojsonobj}}}
                if 'webgis_type' in querydict:
                    if isinstance(querydict['webgis_type'], str) :
                        cond['properties.webgis_type'] = querydict['webgis_type']
                    if isinstance(querydict['webgis_type'], list):
                        cond['properties.webgis_type'] = {'$in': querydict['webgis_type']}
                minDistance = 0
                maxDistance = 0
                if 'min_distance' in querydict and (isinstance(querydict['min_distance'], float) or isinstance(querydict['min_distance'], int)):
                    minDistance = querydict['min_distance']
                if 'max_distance' in querydict and (isinstance(querydict['max_distance'], float) or isinstance(querydict['max_distance'], int)):
                    maxDistance = querydict['max_distance']
                cond['geometry2d']['$nearSphere']['$minDistance'] = minDistance
                cond['geometry2d']['$nearSphere']['$maxDistance'] = maxDistance
                arr = remove_mongo_id(list(collection.find(cond).limit(limit)))

                if 'is_calc_dist' in querydict and (querydict['is_calc_dist'] is True or querydict['is_calc_dist'].lower() == 'true'):
                    if geojsonobj['type'] == 'Point':
                        def get_dist(x = {}):
                            x['properties']['calc_dist'] = calc_dist(geojsonobj['coordinates'], x['geometry']['coordinates'])
                            return x
                        arr = _.map_(arr, get_dist)



                body = json.dumps(arr, ensure_ascii=True, indent=4)
            else:
                body = json.dumps({'result': 'geometry_geojson_required'}, ensure_ascii=True, indent=4)
        else:
            body = json.dumps({'result': 'geometry_required'}, ensure_ascii=True, indent=4)
        return statuscode, mimetype, body


    def handle_geo_within(session, aConfig, querydict, user_id):
        statuscode, mimetype, body = 200, 'text/json', '{}'
        app = aConfig['gConfig']['wsgi']['application']
        db, collection = get_collection(aConfig, app, 'main', 'collection_features')
        limit = 0
        if 'limit' in querydict and isinstance(querydict['limit'], int):
            limit = querydict['limit']
        if 'geometry' in querydict:
            geojsonobj = querydict['geometry']
            if isinstance(geojsonobj, str) :
                try:
                    geojsonobj = json.loads(geojsonobj)
                except:
                    geojsonobj = {}
            if 'type'in geojsonobj:
                cond = {'geometry2d':{'$geoWithin':{'$geometry':geojsonobj}}}
                if 'webgis_type' in querydict:
                    if isinstance(querydict['webgis_type'], str) :
                        cond['properties.webgis_type'] = querydict['webgis_type']
                    if isinstance(querydict['webgis_type'], list):
                        cond['properties.webgis_type'] = {'$in': querydict['webgis_type']}
                arr = list(collection.find(cond).limit(limit))
                body = json.dumps(remove_mongo_id(arr), ensure_ascii=True, indent=4)
            else:
                body = json.dumps({'result': 'geometry_geojson_required'}, ensure_ascii=True, indent=4)
        else:
            body = json.dumps({'result': 'geometry_required'}, ensure_ascii=True, indent=4)
        return statuscode, mimetype, body


        statuscode, mimetype, body = 200, 'text/json', '{}'
        if check_permission(user_id, 'enable_sensor'):
            device_id = None
            db, collection = get_collection(aConfig, app, 'main', 'collection_device')

            if 'tower_id' in querydict:
                device_id = get_device_from_tower(session, aConfig, querydict['tower_id'])
            if 'device_id' in querydict:
                device_id = querydict['device_id']

            #add for db
            device = None
            if device_id:
                cond = {'_id': device_id}
                device = collection.find_one(add_mongo_id(cond))
                if 'sensor_id' in querydict and len(querydict['sensor_id']):
                    sensor_id = querydict['sensor_id']
                    gevent.spawn(savedb, collection, querydict, device, device_id, sensor_id, enable)
                else:
                    gevent.spawn(savedb, collection, querydict, device, device_id, None, enable)

            #add for gSensorControlList
            device = None
            if device_id:
                device = _.find(gSensorControlList, {'_id': device_id})
                device_index = _.find_index(gSensorControlList, {'_id': device_id})
                if device and 'sensors' in device:
                    pass
                else:
                    device = {}
                    device['_id'] = device_id
                    device['sensors'] = []

                if 'sensor_id' in querydict and len(querydict['sensor_id']):
                    sensor_id = querydict['sensor_id']
                    sensor = _.find(device['sensors'], {'_id': sensor_id})
                    if sensor:
                        index = _.find_index(device['sensors'], {'_id': sensor_id})
                        sensor['enable'] = enable
                        if 'interval' in querydict and (isinstance(querydict['interval'], int) or isinstance(querydict['interval'], float)):
                            sensor['interval'] = querydict['interval']
                        device['sensors'][index] = sensor
                    else:
                        sensor = {}
                        sensor['_id'] = sensor_id
                        sensor['enable'] = enable
                        if 'interval' in querydict and (isinstance(querydict['interval'], int) or isinstance(querydict['interval'], float)):
                            sensor['interval'] = querydict['interval']
                        device['sensors'].append(sensor)
                else:
                    for i in range(len(device['sensors'])):
                        device['sensors'][i]['enable'] = enable
                        if 'interval' in querydict and (isinstance(querydict['interval'], int) or isinstance(querydict['interval'], float)):
                            device['sensors'][i]['interval'] = querydict['interval']
                if device_index < 0:
                    gSensorControlList.append(device)
                else:
                    gSensorControlList[device_index] = device

            else:
                body = json.dumps({'result': 'cannot_find_device_id'}, ensure_ascii=True, indent=4)

        else:
            body = json.dumps({'result':'permission_deny'}, ensure_ascii=True, indent=4)
        return statuscode, mimetype, body

    def handle_query_network_data(session, aConfig, querydict, user_id):
        statuscode, mimetype, body = 200, 'text/json', '{}'
        app = aConfig['gConfig']['wsgi']['application']
        db, collection = get_collection(aConfig, app, 'main', 'collection_network')
        limit = 0
        if 'limit' in querydict and isinstance(querydict['limit'], int):
            limit = querydict['limit']
        if 'name' in querydict:
            arr = []
            arr = list(collection.find({'$or':[{'properties.name': {'$regex':'^.*' + querydict['name'] + '.*$'}},{'properties.py': {'$regex':'^.*' + querydict['name']  + '.*$'}}]}).limit(limit))
            if len(arr):
                arr = remove_mongo_id(arr)
            body = json.dumps(arr, ensure_ascii=True, indent=4)
        return statuscode, mimetype, body




    def handle_test_pymagic(session, aConfig, querydict):
        statuscode, mimetype, body = 200, 'text/plain', 'ok'
        if 'serial_no' in querydict \
                and 'ip' in querydict \
                and 'op' in querydict \
                and 'type' in querydict:
            print(querydict)
        else:
            body = 'serial_no of sensor ,ip , op, type are needed'
        return statuscode, mimetype, body


    user_id = None
    if session and '_id' in session:
        user_id = session['_id']
    statuscode, mimetype, body = 200, 'text/json',  '{}'
    app = aConfig['gConfig']['wsgi']['application']
    urllist = []
    for key in aConfig['gConfig']['applications'][app]['url_mapping']:
        urllist.append(Rule(key, endpoint=aConfig['gConfig']['applications'][app]['url_mapping'][key]))
    urlmap = Map(urllist, converters={'bool': BooleanConverter})
    urls = urlmap.bind_to_environ(environ)
    querydict, buf, stream = get_querydict_by_GET_POST(environ)
    try:
        endpoint, args = urls.match()
        if endpoint == 'handle_index':
            statuscode, mimetype, body = handle_index(environ, session)
        elif endpoint == 'handle_login':
            statuscode, mimetype, body = handle_login(session, querydict)
        elif endpoint == 'handle_logout':
            statuscode, mimetype, body = handle_logout(session)
        elif endpoint == 'handle_websocket_client':
            handle_websocket_client(environ, session, user_id)
        # elif endpoint == 'handle_websocket_mavlink':
        #     handle_websocket_mavlink(environ, session, user_id)
        elif endpoint == 'handle_query_feature':
            statuscode, mimetype, body = handle_query_feature(session, aConfig, querydict, user_id)
        elif endpoint == 'handle_query_network_data':
            statuscode, mimetype, body = handle_query_network_data(session, aConfig, querydict, user_id)
        elif endpoint == 'handle_geo_within':
            statuscode, mimetype, body = handle_geo_within(session, aConfig, querydict, user_id)
        elif endpoint == 'handle_geo_near':
            statuscode, mimetype, body = handle_geo_near(session, aConfig, querydict, user_id)
        elif endpoint == 'handle_test_pymagic':
            statuscode, mimetype, body = handle_test_pymagic(session, aConfig, querydict)
        else:
            body = json.dumps({'result':'access_deny'}, ensure_ascii=True, indent=4)

    # except HTTPException, e:
    except Exception as e:
        traceback.print_exc()
        body = json.dumps({'result':'error:%s' % str(e)}, ensure_ascii=True, indent=4)

    # if session:
    #     aConfig['gSessionStore'].save(session)
    # for k in hh:
    #     headers[k] = hh[k]
    return statuscode, mimetype, body