Exemplo n.º 1
0
 def validSuperPeerList(self, superpeer_info):
     try:
         if len(superpeer_info) < 3:
             raise RuntimeError, "one line in superpeers.txt contains at least 3 elements"
         # validIP(superpeer_info[0])
         validPort(int(superpeer_info[1]))
         validPermid(superpeer_info[2])
     except Exception:
         if DEBUG:
             print >> sys.stderr, time.asctime(), "-", "superpeer: Parse error reading", superpeer_info
             print_exc(file=sys.stderr)
         return False
     else:
         return True
Exemplo n.º 2
0
 def validSuperPeerList(self, superpeer_info):
     try:
         if len(superpeer_info) < 3:
             raise RuntimeError, "one line in superpeers.txt contains at least 3 elements"
         #validIP(superpeer_info[0])
         validPort(int(superpeer_info[1]))
         validPermid(superpeer_info[2])
     except Exception:
         if DEBUG:
             print >> sys.stderr, "superpeer: Parse error reading", superpeer_info
             print_exc(file=sys.stderr)
         return False
     else:
         return True
Exemplo n.º 3
0
 def validFriendList(self, friend_info):
     try:
         if len(friend_info) < 4:
             raise RuntimeError, "one line in friends.txt can only contain at least 4 elements"
         validName(friend_info[0])
         validPermid(friend_info[1])
         validIP(friend_info[2])
         validPort(int(friend_info[3]))
     except Exception, msg:
         if DEBUG:
             print "======== reading friend list error ========"
             print friend_info
             print msg
             print "==========================================="
         return False
Exemplo n.º 4
0
    def _decodeGETSUBSMessage(self, message):
        """
        From a bencoded GET_SUBS messages, returns its decoded contents.
        
        Decodes and checks for validity a bencoded GET_SUBS messages.
        If the message is succesfully decoded returns the tuple
        (channel_id,infohash,languages).
        
        channel_id is the binary identifier of the chanel that published
        the requested subtitles.
        infohash is the binary identifier of the torrent wich the subtitle
        refers to
        languages is a list of 3 characters language codes, for the languages
        of the requested subtitles
        
        @return: (channel_id,infohash,languages) or None if something is wrong
        """
        assert message[0] == GET_SUBS, SUBS_LOG_PREFIX + \
            "Invalid GET_SUBS Message header: %s" % message[0]

        try:
            values = bdecode(message[1:])
        except:
            if DEBUG:
                print >> sys.stderr, SUBS_LOG_PREFIX + "Error bdecoding message"
            return None

        if len(values) != 3:
            if DEBUG:
                print >> sys.stderr, SUBS_LOG_PREFIX + "Invalid number of fields in GET_SUBS"
            return None
        channel_id, infohash, bitmask = values[0], values[1], values[2]
        if not validPermid(channel_id):
            if DEBUG:
                print >> sys.stderr, SUBS_LOG_PREFIX + "Invalid channel_id in GET_SUBS"
            return None
        elif not validInfohash(infohash):
            if DEBUG:
                print >> sys.stderr, SUBS_LOG_PREFIX + "Invalid infohash in GET_SUBS"
            return None
        elif not isinstance(bitmask, str) or not len(bitmask) == 4:
            if DEBUG:
                print >> sys.stderr, SUBS_LOG_PREFIX + "Invalid bitmask in GET_SUBS"
            return None

        try:
            bitmask, = unpack("!L", bitmask)
            languages = self._languagesUtility.maskToLangCodes(bitmask)
        except:
            if DEBUG:
                print >> sys.stderr, SUBS_LOG_PREFIX + "Invalid bitmask in GET_SUBS"
            return None

        return channel_id, infohash, languages
 def _decodeGETSUBSMessage(self, message):
     """
     From a bencoded GET_SUBS messages, returns its decoded contents.
     
     Decodes and checks for validity a bencoded GET_SUBS messages.
     If the message is succesfully decoded returns the tuple
     (channel_id,infohash,languages).
     
     channel_id is the binary identifier of the chanel that published
     the requested subtitles.
     infohash is the binary identifier of the torrent wich the subtitle
     refers to
     languages is a list of 3 characters language codes, for the languages
     of the requested subtitles
     
     @return: (channel_id,infohash,languages) or None if something is wrong
     """
     assert message[0] == GET_SUBS, SUBS_LOG_PREFIX + \
         "Invalid GET_SUBS Message header: %s" % message[0]
     
     try:
         values = bdecode(message[1:])
     except:
         if DEBUG:
             print >> sys.stderr, SUBS_LOG_PREFIX + "Error bdecoding message"
         return None
     
     if len(values) != 3:
         if DEBUG:
             print >> sys.stderr, SUBS_LOG_PREFIX + "Invalid number of fields in GET_SUBS"
         return None
     channel_id, infohash, bitmask = values[0], values[1], values[2]
     if not validPermid(channel_id):
         if DEBUG:
             print >> sys.stderr, SUBS_LOG_PREFIX + "Invalid channel_id in GET_SUBS"
         return None
     elif not validInfohash(infohash):
         if DEBUG:
             print >> sys.stderr, SUBS_LOG_PREFIX + "Invalid infohash in GET_SUBS"
         return None
     elif not isinstance(bitmask, str) or not len(bitmask)==4:
         if DEBUG:
             print >> sys.stderr, SUBS_LOG_PREFIX + "Invalid bitmask in GET_SUBS"
         return None
     
     try:
         bitmask, = unpack("!L", bitmask)
         languages = self._languagesUtility.maskToLangCodes(bitmask)
     except:
         if DEBUG:
             print >> sys.stderr, SUBS_LOG_PREFIX + "Invalid bitmask in GET_SUBS"
         return None
     
     return channel_id, infohash, languages
Exemplo n.º 6
0
def getSubtitleFileRelativeName(channel_id, infohash, langCode):
    # subtitles filenames are build from the sha1 hash
    # of the triple (channel_id, infohash, langCode)
    
    # channel_id and infohash are binary versions
    
    assert utilities.validPermid(channel_id), "Invalid channel_id %s" % utilities.show_permid_short(channel_id)
    assert utilities.validInfohash(infohash), "Invalid infohash %s" % bin2str(infohash)
    assert LanguagesProvider.getLanguagesInstance().isLangCodeSupported(langCode), "Unsupported language code %s" % langCode
        
    hasher = sha()
    for data in (channel_id, infohash, langCode):
        hasher.update(data)
    subtitleName = hasher.hexdigest() + SUBS_EXTENSION
    return subtitleName
Exemplo n.º 7
0
    def _decodeSUBSMessage(self, message):
        """
        From a bencoded SUBS message, returns its decoded contents.
        
        Decodes and checks for validity a bencoded SUBS message.
        If the message is succesfully decoded returns the tuple
        (channel_id, infohash, bitmask, contentsDictionary )
        
        channel_id is the binary identifier of the chanel that published
        the requested subtitles.
        infohash is the binary identifier of the torrent wich the subtitle
        refers to
        contentsDictionary is a dictionary having each entry like 
        {langCode : subtitleContents}.
        
        @return: the above described tuple, or None if something is wrong
        """
        assert message[0] == SUBS, SUBS_LOG_PREFIX + \
            "Invalid SUBS Message header: %s" % message[0]

        try:
            values = bdecode(message[1:])
        except:
            if DEBUG:
                print >> sys.stderr, SUBS_LOG_PREFIX + "Error bdecoding SUBS message"
            return None

        if len(values) != 4:
            if DEBUG:
                print >> sys.stderr, SUBS_LOG_PREFIX + "Invalid number of fields in SUBS"
            return None
        channel_id, infohash, bitmask, contents = values[0], values[1], \
            values[2], values[3]

        if not validPermid(channel_id):
            if DEBUG:
                print >> sys.stderr, SUBS_LOG_PREFIX + "Invalid channel_id in SUBS"
            return None
        elif not validInfohash(infohash):
            if DEBUG:
                print >> sys.stderr, SUBS_LOG_PREFIX + "Invalid infohash in SUBS"
            return None
        elif not isinstance(bitmask, str) or not len(bitmask) == 4:
            if DEBUG:
                print >> sys.stderr, SUBS_LOG_PREFIX + "Invalid bitmask in SUBS"
            return None

        try:
            bitmask, = unpack("!L", bitmask)
            languages = self._languagesUtility.maskToLangCodes(bitmask)
        except:
            if DEBUG:
                print >> sys.stderr, SUBS_LOG_PREFIX + "Invalid bitmask in SUBS"
            return None

        if not isinstance(contents, list):
            if DEBUG:
                print >> sys.stderr, SUBS_LOG_PREFIX + "Invalid contents in SUBS"
            return None
        if len(languages) != len(contents):
            if DEBUG:
                print >> sys.stderr, SUBS_LOG_PREFIX + "Bitmask and contents do not match in"\
                      " SUBS"
            return None

        numOfContents = len(languages)
        if numOfContents == 0:
            if DEBUG:
                print >> sys.stderr, SUBS_LOG_PREFIX + "Empty message. Discarding."
            return None

        contentsDictionary = dict()
        for i in range(numOfContents):
            lang = languages[i]
            subtitle = contents[i]
            if len(subtitle) <= self._maxSubSize:
                contentsDictionary[lang] = subtitle
            else:
                #drop that subtitle
                if DEBUG:
                    print >> sys.stderr, SUBS_LOG_PREFIX + "Dropping subtitle, too large", len(
                        subtitle), self._maxSubSize
                continue

        bitmask = self._languagesUtility.langCodesToMask(
            contentsDictionary.keys())
        return channel_id, infohash, bitmask, contentsDictionary
 def _decodeSUBSMessage(self, message):
     """
     From a bencoded SUBS message, returns its decoded contents.
     
     Decodes and checks for validity a bencoded SUBS message.
     If the message is succesfully decoded returns the tuple
     (channel_id, infohash, bitmask, contentsDictionary )
     
     channel_id is the binary identifier of the chanel that published
     the requested subtitles.
     infohash is the binary identifier of the torrent wich the subtitle
     refers to
     contentsDictionary is a dictionary having each entry like 
     {langCode : subtitleContents}.
     
     @return: the above described tuple, or None if something is wrong
     """
     assert message[0] == SUBS, SUBS_LOG_PREFIX + \
         "Invalid SUBS Message header: %s" % message[0]
         
     try:
         values = bdecode(message[1:])
     except:
         if DEBUG:
             print >> sys.stderr, SUBS_LOG_PREFIX + "Error bdecoding SUBS message"
         return None
     
     if len(values) != 4:
         if DEBUG:
             print >> sys.stderr, SUBS_LOG_PREFIX + "Invalid number of fields in SUBS"
         return None
     channel_id, infohash, bitmask, contents = values[0], values[1], \
         values[2], values[3]
     
     if not validPermid(channel_id):
         if DEBUG:
             print >> sys.stderr, SUBS_LOG_PREFIX + "Invalid channel_id in SUBS"
         return None
     elif not validInfohash(infohash):
         if DEBUG:
             print >> sys.stderr, SUBS_LOG_PREFIX + "Invalid infohash in SUBS"
         return None
     elif not isinstance(bitmask, str) or not len(bitmask) == 4:
         if DEBUG:
             print >> sys.stderr, SUBS_LOG_PREFIX + "Invalid bitmask in SUBS"
         return None
     
     try:
         bitmask, = unpack("!L", bitmask)
         languages = self._languagesUtility.maskToLangCodes(bitmask)
     except:
         if DEBUG:
             print >> sys.stderr, SUBS_LOG_PREFIX + "Invalid bitmask in SUBS"
         return None
     
     if not isinstance(contents, list):
         if DEBUG:
             print >> sys.stderr, SUBS_LOG_PREFIX + "Invalid contents in SUBS"
         return None
     if len(languages) != len(contents):
         if DEBUG:
             print >> sys.stderr, SUBS_LOG_PREFIX + "Bitmask and contents do not match in"\
                   " SUBS"
         return None
     
     numOfContents = len(languages)
     if numOfContents == 0:
         if DEBUG:
             print >> sys.stderr, SUBS_LOG_PREFIX + "Empty message. Discarding."
         return None
     
     
     contentsDictionary = dict()
     for i in range(numOfContents):
         lang = languages[i]
         subtitle = contents[i]
         if len(subtitle) <= self._maxSubSize:
             contentsDictionary[lang] = subtitle
         else:
             #drop that subtitle
             if DEBUG:
                 print >> sys.stderr, SUBS_LOG_PREFIX + "Dropping subtitle, too large", len(subtitle), self._maxSubSize
             continue
         
     bitmask = self._languagesUtility.langCodesToMask(contentsDictionary.keys())
     return channel_id, infohash, bitmask, contentsDictionary