예제 #1
0
파일: handlers.py 프로젝트: zero530/fb4u
def api_register_fbuser(*, email, name, passwd, number, birthday):
    if not name or not name.strip():
        raise APIValueError('name')
    if not email or not _RE_EMAIL.match(email):
        raise APIValueError('email')
    if not passwd or not _RE_SHA1.match(passwd):
        raise APIValueError('passwd')
    if not number.isdigit():
        raise APIValueError('number should > 0')
 	#if not birthday:
     #   raise APIValueError('birthday') 
    print("number:" + number)
    #validation user          
    fbusers = yield from FBUser.findAll('email=?', [email])
    if len(fbusers) > 0:
        raise APIError('register:failed', 'email', 'Email is already in use.')

    uid = next_id()
    sha1_passwd = '%s:%s' % (uid, passwd)

    fbuser = FBUser(id=uid, name=name.strip(), email=email, passwd=hashlib.sha1(sha1_passwd.encode('utf-8')).hexdigest(), number=number, birthday=birthday.strip())
    yield from fbuser.save()

    # make session cookie:
    r = web.Response()
    r.set_cookie(COOKIE_NAME, user2cookie(fbuser, 86400), max_age=86400, httponly=True)
    fbuser.passwd = '******'
    r.content_type = 'application/json'
    r.body = json.dumps(fbuser, cls=CJsonEncoder, ensure_ascii=False).encode('utf-8')
    return r
예제 #2
0
파일: handlers.py 프로젝트: zero530/fb4u
def api_register_fbuser(*, email, name, passwd):
    if not name or not name.strip():
        raise APIValueError('name')
    if not email or not _RE_EMAIL.match(email):
        raise APIValueError('email')
    if not passwd or not _RE_SHA1.match(passwd):
        raise APIValueError('passwd')
    users = yield from FBUser.findAll('email=?', [email])
    if len(users) > 0:
        raise APIError('register:failed', 'email', 'Email is already in use.')
    uid = next_id()
    sha1_passwd = '%s:%s' % (uid, passwd)
    fbuser = FBUser(id=uid,
                    name=name.strip(),
                    email=email,
                    passwd=hashlib.sha1(
                        sha1_passwd.encode('utf-8')).hexdigest(),
                    image='http://www.gravatar.com/avatar/%s?d=mm&s=120' %
                    hashlib.md5(email.encode('utf-8')).hexdigest())
    yield from fbuser.save()
    # make session cookie:
    r = web.Response()
    r.set_cookie(COOKIE_NAME,
                 user2cookie(user, 86400),
                 max_age=86400,
                 httponly=True)
    user.passwd = '******'
    r.content_type = 'application/json'
    r.body = json.dumps(user, ensure_ascii=False).encode('utf-8')
    return r
예제 #3
0
파일: handlers.py 프로젝트: zero530/fb4u
def api_get_fbusers(*, page='1'):
    page_index = get_page_index(page)
    num = yield from FBUser.findNumber('count(id)')
    p = Page(num, page_index)
    if num == 0:
        return dict(page=p, users=())
    fbusers = yield from FBUser.findAll(orderBy='created_at desc', limit=(p.offset, p.limit))
    for u in fbusers:
        u.passwd = '******'
    return dict(page=p, users=fbusers)
예제 #4
0
파일: handlers.py 프로젝트: zero530/fb4u
def api_get_fbusers(*, page='1'):
    page_index = get_page_index(page)
    num = yield from FBUser.findNumber('count(id)')
    p = Page(num, page_index)
    if num == 0:
        return dict(page=p, users=())
    fbusers = yield from FBUser.findAll(orderBy='created_at desc',
                                        limit=(p.offset, p.limit))
    for u in fbusers:
        u.passwd = '******'
    return dict(page=p, users=fbusers)
예제 #5
0
 def get(self):
     uid = self.request.get("uid",'534881870')
     user = FBUser.get_by_key_name(uid)
     friends = memcache.get(key='FriendReports_%s')
     if not friends:
         friends = FBUser.gql('WHERE friends = :1 ORDER BY name,id',user.key()).run()
         memcache.add(key='FriendReports_%s' % str(user.id),value=friends,time=240)
     base_path = os.path.join(os.path.dirname(__file__).replace('reports',''), "templates")
     path = os.path.join(base_path, "header.html")
     self.response.out.write(template.render(path, {}))
     args = dict(user=user,friends=friends)
     path = os.path.join(base_path, "user.html")
     self.response.out.write(template.render(path, args))
     path = os.path.join(base_path, "footer.html")
     self.response.out.write(template.render(path, {}))
예제 #6
0
 def get(self):
     uid = self.request.get("uid",'534881870')
     # Key
     #userKey = escape(self.request.get('uk','')
     #user = db.get(userKey)
     user = FBUser.get_by_key_name(uid)
     friends = memcache.get(key='FriendReports_%s' % uid)
     if not friends and user:
         friends = FBUser.gql('WHERE friends = :1 ORDER BY name,id',user.key()).run()
         memcache.add(key='FriendReports_%s' % str(user.id),value=friends,time=240)
     if user:
         data = [{'name':f.name,
                  'id':f.id,
                  'pic':'http://graph.facebook.com/%s/picture?type=square' % f.id,
                  'friends':[ff.id_or_name() for ff in f.friends]} for f in friends]
         self.response.out.write(json.dumps(data))
예제 #7
0
파일: handlers.py 프로젝트: zero530/fb4u
def cookie2user(cookie_str):
    '''
    Parse cookie and load user if cookie is valid.
    '''
    if not cookie_str:
        return None
    try:
        L = cookie_str.split('-')
        if len(L) != 3:
            return None
        uid, expires, sha1 = L
        if int(expires) < time.time():
            return None
        user = yield from FBUser.find(uid)
        if user is None:
            return None
        s = '%s-%s-%s-%s' % (uid, user.passwd, expires, _COOKIE_KEY)
        if sha1 != hashlib.sha1(s.encode('utf-8')).hexdigest():
            logging.info('invalid sha1')
            return None
        user.passwd = '******'
        return user
    except Exception as e:
        logging.exception(e)
        return None
예제 #8
0
파일: queue.py 프로젝트: ericof/facefriends
 def _storeFriends(self,friends,start=0,end=300,user_key=None):
     ''' Store friends as User objects
     '''
     users = []
     for friend in friends[start:end]:
         bFriends = [str(uid) for uid in friend.get('friends',user_key)] #user_key and [user_key,] or []
         fId = str(friend.get('id',friend.get('uid')))
         fName = friend.get('name')
         fFirstName = friend.get('first_name')
         fLastName = friend.get('last_name')
         fBirthday = friend.get('birthday_date')
         fSex = friend.get('sex')
         profile = {'id':fId,
                    'name':fName,
                    'first_name':fFirstName,
                    'last_name':fLastName,
                    'birthday':fBirthday,
                    'gender':fSex}
         user = FBUser.get_or_insert(key_name=str(fId),**profile)
         for k,v in profile.items():
             value = getattr(user,k)
             if v and not(v==value):
                 setattr(user,k,v)
         users.append(user)
     db.put(users)
     return users
예제 #9
0
파일: queue.py 프로젝트: ericof/facefriends
 def post(self):
     uid = self.request.get("user_id")
     start = self.request.get("start",0)
     end = self.request.get("end",0)
     user = FBUser.get_by_key_name(uid)
     logging.debug('User ID (%s) Start (%s) End(%s)' % (str(user.id),str(start),str(end)))
     data = memcache.get('friends_%s' % str(user.id))
     if not data:
         graph = facebook.GraphAPI(user.access_token)
         friends = graph.get_connections(user.id, "friends")
         friends = friends.get('data',[])
     else:
         friends = data
     try:
         friends = self._storeFriends(friends,int(start),int(end),user.key())
         actualFriends = user.friends
         friends = [f.key() for f in friends if f.key() not in actualFriends]
         actualFriends.extend(friends)
         user.friends = actualFriends
         user.put()
     except DeadlineExceededError:
         self.response.clear()
         self.response.set_status(500)
         self.response.out.write("This operation could not be completed in time...")
     finally:
         queues = memcache.get('queues_%s' % str(user.id))
         queues.remove((int(start),int(end)))
         if queues:
             # Ainda temos uma fila?
             memcache.replace('queues_%s' % str(user.id),queues)
         else:
             logging.debug('Adding friendsFriendsUp')
             taskqueue.add(queue_name='friendsFriendsUp' ,url='/queue/queueFriends', params={'user_id':user.id,})
예제 #10
0
파일: base.py 프로젝트: ericof/facefriends
 def updateUser(self,user,profile={}):
     ''' Let's update this user
     '''
     base_properties = ['first_name','last_name','name','link','about','birthday',
                        'email','website','bio','quotes','gender',
                        'relationship_status', 'religion','political','timezone']
     list_properties = ['interested_in','meeting_for']
     geo_properties = ['hometown','location']
     for prop in base_properties:
         value = profile.get(prop)
         if hasattr(user,prop) and value:
             setattr(user,prop,value)
         
     # Update Hometown and Location               
     for prop in geo_properties:
         value = profile.get(prop)
         if hasattr(user,prop) and value:
             location = self._location(value.get('id'),value.get('name'))
             setattr(user,prop,location)
     
     if 'significant_other' in profile:
         fName = profile.get('significant_other')['name']
         fId = profile.get('significant_other')['id']
         profile = {'id':fId,'name':fName}
         user = FBUser.get_or_insert(key_name=str(fId),**profile)
         user.significant_other = tmpUser
예제 #11
0
파일: handlers.py 프로젝트: zero530/fb4u
def cookie2user(cookie_str):
    '''
    Parse cookie and load user if cookie is valid.
    '''
    if not cookie_str:
        return None
    try:
        L = cookie_str.split('-')
        if len(L) != 3:
            return None
        uid, expires, sha1 = L
        if int(expires) < time.time():
            return None
        user = yield from FBUser.find(uid)
        if user is None:
            return None
        s = '%s-%s-%s-%s' % (uid, user.passwd, expires, _COOKIE_KEY)
        if sha1 != hashlib.sha1(s.encode('utf-8')).hexdigest():
            logging.info('invalid sha1')
            return None
        user.passwd = '******'
        return user
    except Exception as e:
        logging.exception(e)
        return None
예제 #12
0
파일: handlers.py 프로젝트: zero530/fb4u
def authenticate(*, email, passwd):
    if not email:
        raise APIValueError('email', 'Invalid email.')
    if not passwd:
        raise APIValueError('passwd', 'Invalid password.')
    fbusers = yield from FBUser.findAll('email=?', [email])
    if len(fbusers) == 0:
        raise APIValueError('email', 'Login failed, Email not exist.')
    fbuser = fbusers[0]
    # check passwd:
    sha1 = hashlib.sha1()
    sha1.update(fbuser.id.encode('utf-8'))
    sha1.update(b':')
    sha1.update(passwd.encode('utf-8'))
    if fbuser.passwd != sha1.hexdigest():
        raise APIValueError('passwd', 'Invalid password.')
    # authenticate ok, set cookie:
    r = web.Response()
    r.set_cookie(COOKIE_NAME,
                 user2cookie(fbuser, 86400),
                 max_age=86400,
                 httponly=True)
    fbuser.passwd = '******'
    r.content_type = 'application/json'
    r.body = json.dumps(fbuser, cls=CJsonEncoder).encode('utf-8')

    return r
예제 #13
0
 def get(self):
     """ Let's get the friends of this user
     """
     users = FBUser.gql("WHERE accessed = TRUE").run()
     for user in users:
         logging.debug(user.id)
         taskqueue.add(url="/queue/getFriends", params={"user_id": user.id})
     self.response.out.write("Feito")
예제 #14
0
파일: queue.py 프로젝트: ericof/facefriends
 def post(self):
     limit = 40
     uid = self.request.get("user_id")
     user = FBUser.get_by_key_name(uid)
     fql = facebook.FQL(user.access_token)
     query ={"friends":
                 """SELECT uid,first_name,last_name,name,sex,birthday_date
                    FROM 
                         user 
                    WHERE 
                         uid in (SELECT uid2 FROM friend WHERE uid1=%s)""" % str(user.id),
             "friendFriends":
                 """SELECT 
                         uid1,
                         uid2 
                    FROM 
                         friend 
                    WHERE 
                         uid1 IN (SELECT uid FROM #friends) 
                         AND uid2 in (SELECT uid FROM #friends)
                 """}
     try:
         friendsQuery,ffQuery = fql.multiquery(queries = query)
     except ValueError:
         logging.debug(fql.multiquery(queries = query))
         return ''
     friendsQuery = friendsQuery[u'fql_result_set']
     ffQuery = ffQuery[u'fql_result_set']
     tmpFF = {}
     for relation in ffQuery:
         uid1 = relation.get('uid1')
         uid2 = relation.get('uid2')
         if not str(uid1) in tmpFF:
             tmpFF[str(uid1)] = []
         tmpFF[str(uid1)].append(str(uid2))
     friends = []
     for friend in friendsQuery:
         friend['id'] = str(friend['uid'])
         friend['friends'] = tmpFF.get(str(friend['uid']),[])
         friends.append(friend)
     
     if friends:
         memcache.add(key="friends_%s" % str(user.id), value=friends, time=180)
     if tmpFF:
         memcache.add(key='queue_%s' % str(user.id),value=tmpFF,time=240)
     nUsers = len(friends)
     
     ranges = [(r,((((r+limit)<nUsers) and (r+limit)) or nUsers)) for r in range(0,nUsers,limit)]
     memcache.delete(key='queues_%s' % str(user.id))   
     tmpQueues = []
     for s,e in ranges:
         tmpQueues.append((s,e))
         logging.debug('Adiciona tarefa na fila %d - %d' % (s,e))
         taskqueue.add(queue_name='friendsUp' ,url='/queue/friend_fetch', params={'user_id':user.id,
                                                                            'start':s,
                                                                            'end':e,})
     memcache.add(key='queues_%s' % str(user.id),value=tmpQueues,time=180)                                                                       
예제 #15
0
파일: handlers.py 프로젝트: zero530/fb4u
def api_register_fbuser(*, email, name, passwd, number, birthday):
    if not name or not name.strip():
        raise APIValueError('name')
    if not email or not _RE_EMAIL.match(email):
        raise APIValueError('email')
    if not passwd or not _RE_SHA1.match(passwd):
        raise APIValueError('passwd')
    if not number.isdigit():
        raise APIValueError('number should > 0')

#if not birthday:
#   raise APIValueError('birthday')
    print("number:" + number)
    #validation user
    fbusers = yield from FBUser.findAll('email=?', [email])
    if len(fbusers) > 0:
        raise APIError('register:failed', 'email', 'Email is already in use.')

    uid = next_id()
    sha1_passwd = '%s:%s' % (uid, passwd)

    fbuser = FBUser(id=uid,
                    name=name.strip(),
                    email=email,
                    passwd=hashlib.sha1(
                        sha1_passwd.encode('utf-8')).hexdigest(),
                    number=number,
                    birthday=birthday.strip())
    yield from fbuser.save()

    # make session cookie:
    r = web.Response()
    r.set_cookie(COOKIE_NAME,
                 user2cookie(fbuser, 86400),
                 max_age=86400,
                 httponly=True)
    fbuser.passwd = '******'
    r.content_type = 'application/json'
    r.body = json.dumps(fbuser, cls=CJsonEncoder,
                        ensure_ascii=False).encode('utf-8')
    return r
예제 #16
0
파일: handlers.py 프로젝트: zero530/fb4u
def api_register_fbuser(*, email, name, passwd):
    if not name or not name.strip():
        raise APIValueError('name')
    if not email or not _RE_EMAIL.match(email):
        raise APIValueError('email')
    if not passwd or not _RE_SHA1.match(passwd):
        raise APIValueError('passwd')
    users = yield from FBUser.findAll('email=?', [email])
    if len(users) > 0:
        raise APIError('register:failed', 'email', 'Email is already in use.')
    uid = next_id()
    sha1_passwd = '%s:%s' % (uid, passwd)
    fbuser = FBUser(id=uid, name=name.strip(), email=email, passwd=hashlib.sha1(sha1_passwd.encode('utf-8')).hexdigest(), image='http://www.gravatar.com/avatar/%s?d=mm&s=120' % hashlib.md5(email.encode('utf-8')).hexdigest())
    yield from fbuser.save()
    # make session cookie:
    r = web.Response()
    r.set_cookie(COOKIE_NAME, user2cookie(user, 86400), max_age=86400, httponly=True)
    user.passwd = '******'
    r.content_type = 'application/json'
    r.body = json.dumps(user, ensure_ascii=False).encode('utf-8')
    return r
예제 #17
0
파일: views.py 프로젝트: pynchia/sputafrasi
def editpref(request):
    """lets the user set her preferences
    """
#    me = request.facebook.graph.get_object('me')
    me = {}
    me['name'] = 'xyz'
    me['id'] = '69DFS3242R'

    try:
        # get user data from DB
        fbuser = FBUser.objects.get(fbid=me['id'])
    except FBUser.DoesNotExist:
        # that id is not in the DB, so create it
        # I am not using get_or_create() because
        # the user might have changed her name on FB
        fbuser = FBUser(fbid=me['id'], name=me['name'])
        fbuser.save()

    form = forms.UserPrefForm(instance=fbuser)
    #return render_to_response('editpref.html',
    #                          {'form': form},
    #                          context_instance=RequestContext(request))
    return render(request, 'editpref.html',
                  {'form': form})
예제 #18
0
파일: base.py 프로젝트: ericof/facefriends
 def current_user(self):
     if not hasattr(self, "_current_user"):
         self._current_user = None
         self.cookie = facebook.get_user_from_cookie(self.request.cookies, FACEBOOK_APP_ID, FACEBOOK_APP_SECRET)
         if self.cookie:
             user = FBUser.get_by_key_name(self.cookie["uid"])
             graph = facebook.GraphAPI(self.cookie["access_token"])
             profile = graph.get_object("me")
             if not user:
                 user = self.createUser(accessed=True,profile=profile)
                 user.access_token = self.cookie["access_token"]
             elif user.access_token != self.cookie["access_token"]:
                 user.access_token = self.cookie["access_token"]
             self.updateUser(user,profile=profile)
             user.accessed = True
             user.put()
             self._current_user = user
     return self._current_user
예제 #19
0
파일: queue.py 프로젝트: ericof/facefriends
 def post(self):
     limit = 100
     user_id = self.request.get("user_id")
     logging.debug('QueueFriends Start')
     data = memcache.get('queue_%s' % str(user_id))
     if not data:
         return ''
     users = FBUser.get_by_key_name(data.keys())
     nUsers = len(users)
     dictUsers = dict([(u.id,u.key()) for u in users])
     ranges = [(r,((((r+limit)<nUsers) and (r+limit)) or nUsers)) for r in range(0,nUsers,limit)]
     for s,e in ranges:
         tmpUsers = []
         for user in users[s:e]:
             actualFriends = user.friends
             newFriends = [dictUsers.get(uid,None) for uid in data[user.id] if not(dictUsers.get(uid,None) in actualFriends)]
             actualFriends.extend([k for k in newFriends if k])
             if actualFriends:
                 user.friends = actualFriends
             tmpUsers.append(user)
         db.put(tmpUsers)
     memcache.delete('queue_%s' % str(user_id))
예제 #20
0
파일: handlers.py 프로젝트: zero530/fb4u
def authenticate(*, email, passwd):
    if not email:
        raise APIValueError('email', 'Invalid email.')
    if not passwd:
        raise APIValueError('passwd', 'Invalid password.')
    fbusers = yield from FBUser.findAll('email=?', [email])
    if len(fbusers) == 0:
        raise APIValueError('email', 'Login failed, Email not exist.')
    fbuser = fbusers[0]
    # check passwd:
    sha1 = hashlib.sha1()
    sha1.update(fbuser.id.encode('utf-8'))
    sha1.update(b':')
    sha1.update(passwd.encode('utf-8'))
    if fbuser.passwd != sha1.hexdigest():
        raise APIValueError('passwd', 'Invalid password.')
    # authenticate ok, set cookie:
    r = web.Response()
    r.set_cookie(COOKIE_NAME, user2cookie(fbuser, 86400), max_age=86400, httponly=True)
    fbuser.passwd = '******'
    r.content_type = 'application/json'
    r.body = json.dumps(fbuser, cls=CJsonEncoder).encode('utf-8')

    return r
예제 #21
0
파일: base.py 프로젝트: ericof/facefriends
 def getUserById(self,id):
     ''' Given a user_id we get a instance of FBUser
     '''
     return FBUser.get_by_key_name(id)
 def init_me(self):
     t = Graph.fetch_user_information(self.graph, True)
     self.me = FBUser(t[u'uid'], t[u'name'], t[u'interests'])
 def init_friends(self):
     for l in Graph.fetch_user_information(self.graph, False):
         self.friends.append(FBUser(l[u'uid'], l[u'name'], l[u'interests']))