Example #1
0
 def endpoint(self, request):
     logger.debug('client from %s requested: %s' % (request.remote_addr, request.params))
     
     if 'api' not in request.GET:
         raise HTTPBadRequest()
 
     result = Struct({'api_version':API_VERSION, 'auth':0})   
 
     if 'api_key' in request.POST:
         api_key = request.POST['api_key']        
         user = User.validate_api_key(api_key)
         if not user: 
             logger.warn('unknown API key %s, unauthorized' % api_key)
             return self.respond_with_json(result)  
     else:
         logger.warn('missing API key, unauthorized')               
         return self.respond_with_json(result)
 
     # Authorized
     result.auth = 1
 
     # It looks like client *can* send multiple commands at time
     for command, handler in COMMANDS:
         if command in request.params:            
             handler(request, user, result)
 
     result.last_refreshed_on_time = get_last_refreshed_on_time()
 
     return self.respond_with_json(result)
Example #2
0
def _parse(parser, data):
    try:
        parser.feed(data)
    except HTMLParseError, exc:
        # Log exception and raise it again
        logger.debug('could not parse markup (%s)' % exc.msg)
        raise exc
Example #3
0
    def endpoint(self, request):
        logger.debug('client from %s requested: %s' %
                     (request.remote_addr, request.params))

        if 'api' not in request.GET:
            raise HTTPBadRequest()

        result = Struct({'api_version': API_VERSION, 'auth': 0})

        if 'api_key' in request.POST:
            api_key = request.POST['api_key']
            user = User.validate_api_key(api_key)
            if not user:
                logger.warn('unknown API key %s, unauthorized' % api_key)
                return self.respond_with_json(result)
        else:
            logger.warn('missing API key, unauthorized')
            return self.respond_with_json(result)

        # Authorized
        result.auth = 1

        # It looks like client *can* send multiple commands at time
        for command, handler in COMMANDS:
            if command in request.params:
                handler(request, user, result)

        result.last_refreshed_on_time = get_last_refreshed_on_time()

        return self.respond_with_json(result)
Example #4
0
def mark_command(request, user, result):

    try:
        mark, status, object_id = request.POST['mark'], request.POST['as'], int(request.POST['id'])
    except (KeyError, ValueError), ex:
        logger.debug('missing or invalid parameter (%s), ignored' % ex)
        return      
Example #5
0
def _parse(parser, data):    
    try:
        parser.feed(data)    
    except HTMLParseError, exc:
        # Log exception and raise it again
        logger.debug(u'could not parse markup (%s)' % exc.msg)
        raise exc
Example #6
0
def mark_command(request, user, result):

    try:
        mark, status, object_id = request.POST['mark'], request.POST[
            'as'], int(request.POST['id'])
    except (KeyError, ValueError), ex:
        logger.debug('missing or invalid parameter (%s), ignored' % ex)
        return
Example #7
0
    def start_img(self, attrs):
        d = dict(_normalize_attrs(attrs))
        if 'src' in d:        
            if self.is_blacklisted(d['src']):
                self.pieces.append(d['alt'] if 'alt' in d else '')
                logger.debug(u'matched image with blacklisted src=%s' % d['src'])
                return

        # Proceed to default handling        
        self.unknown_starttag('img', attrs)
Example #8
0
 def start_a(self, attrs):
     d = dict(_normalize_attrs(attrs))
     if 'href' in d:
         if self.is_blacklisted(d['href']):
             logger.debug(u'matched anchor with blacklisted href=%s' % d['href'])
             self.blacklisted += 1
             return
             
     # Proceed to default handling        
     self.unknown_starttag('a', attrs)
Example #9
0
def set_session(sid, value, timeout=SESSION_TIMEOUT):

    session = get_session(sid)
    if not session:
        # New session if sid not present
        session = Session(key=sid)
        logger.debug(u"session %s created" % sid)

    session.expires_on = (datetime.utcnow() + timedelta(seconds=timeout)).replace(microsecond=0)
    session.value = value
    session.save()
Example #10
0
def set_session(sid, value, timeout=SESSION_TIMEOUT):

    session = get_session(sid)
    if not session:
        # New session if sid not present
        session = Session(key=sid)
        logger.debug(u"session %s created" % sid)

    session.expires_on = (datetime.utcnow() +
                          timedelta(seconds=timeout)).replace(microsecond=0)
    session.value = value
    session.save()
Example #11
0
def get_session(sid, default=None):
    try:
        session = Session.get(Session.key==sid)
    except Session.DoesNotExist:
        return default
    
    # Expired?
    if session.expires_on < datetime.utcnow().replace(microsecond=0):
        session.delete_instance()
        logger.debug(u"session %s is expired, deleted" % sid)
        return default
    
    return session
Example #12
0
def get_session(sid, default=None):
    try:
        session = Session.get(Session.key == sid)
    except Session.DoesNotExist:
        return default

    # Expired?
    if session.expires_on < datetime.utcnow().replace(microsecond=0):
        session.delete_instance()
        logger.debug(u"session %s is expired, deleted" % sid)
        return default

    return session
Example #13
0
def add_feeds_from_file(source, user):
    """
    Add feeds to database reading from a file containing OPML data. 
    """    
    default_group = Group.get(Group.title == Group.DEFAULT_GROUP)    

    feeds = []    
    groups = [default_group]
    
    for event, element in ElementTree.iterparse(source, events=('start','end')):
        if event == 'start':
             if (element.tag == 'outline') and ('xmlUrl' not in element.attrib):
                # Entering a group
                group = Group()

                for k, v in element.attrib.items():
                    if k in group_allowed_attribs:
                        setattr(group, group_allowed_attribs[k], v)

                try:
                    group = Group.get(Group.title==group.title)
                except Group.DoesNotExist:
                    group.save()
                    logger.debug('added group %s to database' % group.title)

                groups.append(group)

        elif event == 'end':
            if (element.tag == 'outline') and ('xmlUrl' in element.attrib):
                # Leaving a feed
                feed = Feed()

                for k, v in element.attrib.items():
                    if k in feed_allowed_attribs:
                        setattr(feed, feed_allowed_attribs[k], v)

                feed = add_feed(feed, fetch_icon=True, add_entries=True)
                add_subscription(feed, user, groups[-1])
                feeds.append(feed)
            elif element.tag == 'outline':
                # Leaving a group
                groups.pop()
                        
                    
    
    return feeds
Example #14
0
def add_feeds_from_file(source, user):
    """
    Add feeds to database reading from a file containing OPML data. 
    """
    default_group = Group.get(Group.title == Group.DEFAULT_GROUP)

    feeds = []
    groups = [default_group]

    for event, element in ElementTree.iterparse(source,
                                                events=('start', 'end')):
        if event == 'start':
            if (element.tag == 'outline') and ('xmlUrl' not in element.attrib):
                # Entering a group
                group = Group()

                for k, v in element.attrib.items():
                    if k in group_allowed_attribs:
                        setattr(group, group_allowed_attribs[k], v)

                try:
                    group = Group.get(Group.title == group.title)
                except Group.DoesNotExist:
                    group.save()
                    logger.debug('added group %s to database' % group.title)

                groups.append(group)

        elif event == 'end':
            if (element.tag == 'outline') and ('xmlUrl' in element.attrib):
                # Leaving a feed
                feed = Feed()

                for k, v in element.attrib.items():
                    if k in feed_allowed_attribs:
                        setattr(feed, feed_allowed_attribs[k], v)

                feed = add_feed(feed, fetch_icon=True, add_entries=True)
                add_subscription(feed, user, groups[-1])
                feeds.append(feed)
            elif element.tag == 'outline':
                # Leaving a group
                groups.pop()

    return feeds
Example #15
0
def mark_command(request, user, result):

    try:
        mark, status, object_id = request.POST['mark'], request.POST['as'], int(request.POST['id'])
    except (KeyError, ValueError), ex:
        logger.debug('missing or invalid parameter (%s), ignored' % ex)
        return      

    if mark == 'item':

        try:
            # Sanity check
            entry = Entry.get(Entry.id == object_id)  
        except Entry.DoesNotExist:
            logger.debug('could not find entry %d, ignored' % object_id)
            return

        if status == 'read':
            try:
                Read.create(user=user, entry=entry)
            except IntegrityError:
                logger.debug('entry %d already marked as read, ignored' % object_id)
                return
        # Strangely enough 'unread' is not mentioned in 
        #  the Fever API, but Reeder app asks for it
        elif status == 'unread':
            count = Read.delete().where((Read.user==user) & (Read.entry==entry)).execute()
            if not count:
                logger.debug('entry %d never marked as read, ignored' % object_id)
                return
Example #16
0
def unread_recently_command(request, user, result):    
    since = datetime.utcnow() - timedelta(seconds=RECENTLY_READ_DELTA)    
    q = Read.delete().where((Read.user==user) & (Read.read_on > since)) 
    count = q.execute()
    logger.debug('%d entries marked as unread' % count)
Example #17
0
def unread_recently_command(request, user, result):
    since = datetime.utcnow() - timedelta(seconds=RECENTLY_READ_DELTA)
    q = Read.delete().where((Read.user == user) & (Read.read_on > since))
    count = q.execute()
    logger.debug('%d entries marked as unread' % count)
Example #18
0
def mark_command(request, user, result):

    try:
        mark, status, object_id = request.POST['mark'], request.POST[
            'as'], int(request.POST['id'])
    except (KeyError, ValueError), ex:
        logger.debug('missing or invalid parameter (%s), ignored' % ex)
        return

    if mark == 'item':

        try:
            # Sanity check
            entry = Entry.get(Entry.id == object_id)
        except Entry.DoesNotExist:
            logger.debug('could not find entry %d, ignored' % object_id)
            return

        if status == 'read':
            try:
                Read.create(user=user, entry=entry)
            except IntegrityError:
                logger.debug('entry %d already marked as read, ignored' %
                             object_id)
                return
        # Strangely enough 'unread' is not mentioned in
        #  the Fever API, but Reeder app asks for it
        elif status == 'unread':
            count = Read.delete().where((Read.user == user)
                                        & (Read.entry == entry)).execute()
            if not count: