Ejemplo n.º 1
0
 def take_while_not(self, stopsymbol, typecast=None):
     try:
         stopsymbol_position = self._str.index(stopsymbol, self._position)
     except ValueError:
         raise _PhpUnserializationError("No `%s`" % stopsymbol, self.get_rest())
     result = self._str[self._position : stopsymbol_position]
     self._position = stopsymbol_position + 1
     if typecast is None:
         return result
     else:
         return typecast(result)
Ejemplo n.º 2
0
    def unserialize(self):
        t = self.take()

        if t == "N":
            self.await(";")
            return None

        self.await(":")

        if t == "i":
            return self.take_while_not(";", int)

        if t == "d":
            return self.take_while_not(";", float)

        if t == "b":
            return bool(self.take_while_not(";", int))

        if t == "s":
            size = self.take_while_not(":", int)
            self.await('"')
            result = self.take(size)
            self.await('";', 2)
            return result

        if t == "a":
            size = self.take_while_not(":", int)
            return self.parse_hash_core(size)

        if t == "O":
            object_name_size = self.take_while_not(":", int)
            self.await('"')
            object_name = self.take(object_name_size)
            self.await('":', 2)
            object_length = self.take_while_not(":", int)
            php_class = PHP_Class(object_name)
            members = self.parse_hash_core(object_length)
            if members:
                for php_name, value in members.items():
                    php_class.set_item(php_name, value)
            return php_class

        raise _PhpUnserializationError("Unknown type `%s`" % t, self.get_rest())
Ejemplo n.º 3
0
    def unserialize(self):
        t = self.take()

        if t == 'N':
            self.await(';')
            return None

        self.await(':')

        if t == 'i':
            return self.take_while_not(';', int)

        if t == 'd':
            return self.take_while_not(';', float)

        if t == 'b':
            return bool(self.take_while_not(';', int))

        if t == 's':
            size = self.take_while_not(':', int)
            self.await('"')
            result = self.take(size)
            self.await('";', 2)
            return result

        if t == 'a':
            size = self.take_while_not(':', int)
            return self.parse_hash_core(size)

        if t == 'O':
            object_name_size = self.take_while_not(':', int)
            self.await('"')
            object_name = self.take(object_name_size)
            self.await('":', 2)
            object_length = self.take_while_not(':', int)
            php_class = PHP_Class(object_name)
            members = self.parse_hash_core(object_length)
            if members:
                for php_name, value in members.items():
                    php_class.set_item(php_name, value)
            return php_class

        raise _PhpUnserializationError('Unknown type `%s`' % t, self.get_rest())
Ejemplo n.º 4
0
        )

    raise PhpSerializationError("PHP serialize: cannot encode `%s`" % struct)


class Unserializator(object):
    def __init__(self, s):
        self._position = 0
        self._str = s

    def await(self, symbol, n=1):
        # result = self.take(len(symbol))
        result = self._str[self._position : self._position + n]
        self._position += n
        if result != symbol:
            raise _PhpUnserializationError("Next is `%s` not `%s`" % (result, symbol), self.get_rest())

    def take(self, n=1):
        result = self._str[self._position : self._position + n]
        self._position += n
        return result

    def take_while_not(self, stopsymbol, typecast=None):
        try:
            stopsymbol_position = self._str.index(stopsymbol, self._position)
        except ValueError:
            raise _PhpUnserializationError("No `%s`" % stopsymbol, self.get_rest())
        result = self._str[self._position : stopsymbol_position]
        self._position = stopsymbol_position + 1
        if typecast is None:
            return result