Example #1
0
  def _ParseDateTimeValue(self, byte_stream, file_offset):
    """Parses a CUPS IPP RFC2579 date-time value from a byte stream.

    Args:
      byte_stream (bytes): byte stream.
      file_offset (int): offset of the attribute data relative to the start of
          the file-like object.

    Returns:
      dfdatetime.RFC2579DateTime: RFC2579 date-time stored in the value.

    Raises:
      ParseError: when the RFC2579 date-time value cannot be parsed.
    """
    datetime_value_map = self._GetDataTypeMap('cups_ipp_datetime_value')

    try:
      value = self._ReadStructureFromByteStream(
          byte_stream, file_offset, datetime_value_map)
    except (ValueError, errors.ParseError) as exception:
      raise errors.ParseError(
          'Unable to parse datetime value with error: {0!s}'.format(exception))

    direction_from_utc = chr(value.direction_from_utc)
    rfc2579_date_time_tuple = (
        value.year, value.month, value.day_of_month,
        value.hours, value.minutes, value.seconds, value.deciseconds,
        direction_from_utc, value.hours_from_utc, value.minutes_from_utc)
    return dfdatetime_rfc2579_date_time.RFC2579DateTime(
        rfc2579_date_time_tuple=rfc2579_date_time_tuple)
    def testCopyToDateTimeStringISO8601(self):
        """Tests the CopyToDateTimeStringISO8601 function."""
        rfc2579_date_time_object = rfc2579_date_time.RFC2579DateTime(
            rfc2579_date_time_tuple=(2010, 8, 12, 20, 6, 31, 6, '+', 0, 0))

        date_time_string = rfc2579_date_time_object.CopyToDateTimeStringISO8601(
        )
        self.assertEqual(date_time_string, '2010-08-12T20:06:31.6+00:00')
    def testGetNormalizedTimestamp(self):
        """Tests the _GetNormalizedTimestamp function."""
        rfc2579_date_time_object = rfc2579_date_time.RFC2579DateTime(
            rfc2579_date_time_tuple=(2010, 8, 12, 20, 6, 31, 6, '+', 0, 0))

        normalized_timestamp = rfc2579_date_time_object._GetNormalizedTimestamp(
        )
        self.assertEqual(normalized_timestamp, decimal.Decimal('1281643591.6'))

        rfc2579_date_time_object = rfc2579_date_time.RFC2579DateTime(
            rfc2579_date_time_tuple=(2010, 8, 12, 20, 6, 31, 6, '+', 1, 0))

        normalized_timestamp = rfc2579_date_time_object._GetNormalizedTimestamp(
        )
        self.assertEqual(normalized_timestamp, decimal.Decimal('1281639991.6'))

        rfc2579_date_time_object = rfc2579_date_time.RFC2579DateTime()

        normalized_timestamp = rfc2579_date_time_object._GetNormalizedTimestamp(
        )
        self.assertIsNone(normalized_timestamp)
Example #4
0
    def _ReadPair(self, parser_mediator, file_object):
        """Reads an attribute name and value pair from a CUPS IPP event.

    Args:
      parser_mediator (ParserMediator): mediates interactions between parsers
          and other components, such as storage and dfvfs.
      file_object (dfvfs.FileIO): file-like object.

    Returns:
      tuple: contains:

        str: name or None.
        str: value or None.
    """
        # Pair = Type ID + Name + Value.
        try:
            # Can be:
            #   Group ID + IDtag = Group ID (1byte) + Tag ID (1byte) + '0x00'.
            #   IDtag = Tag ID (1byte) + '0x00'.
            type_id = self.INTEGER_8.parse_stream(file_object)
            if type_id == self.GROUP_END:
                return None, None

            elif type_id in self.GROUP_LIST:
                # If it is a group ID we must read the next byte that contains
                # the first TagID.
                type_id = self.INTEGER_8.parse_stream(file_object)

            # 0x00 separator character.
            self.INTEGER_8.parse_stream(file_object)

        except (IOError, construct.FieldError) as exception:
            parser_mediator.ProduceExtractionError(
                'unable to parse pair identifier with error: {0!s}'.format(
                    exception))
            return None, None

        # Name = Length name + name + 0x00
        try:
            pair_name = self.PAIR_NAME.parse_stream(file_object)
        except (IOError, construct.FieldError) as exception:
            parser_mediator.ProduceExtractionError(
                'unable to parse pair name with error: {0!s}'.format(
                    exception))
            return None, None

        try:
            name = pair_name.text.decode('utf-8')
        except UnicodeDecodeError as exception:
            parser_mediator.ProduceExtractionError(
                'unable to decode pair name with error: {0!s}'.format(
                    exception))
            return None, None

        # Value: can be integer, boolean or text select by Type ID.
        if type_id in (self.TYPE_GENERAL_INTEGER, self.TYPE_INTEGER,
                       self.TYPE_ENUMERATION):
            value_structure = self.INTEGER
        elif type_id == self.TYPE_BOOL:
            value_structure = self.BOOLEAN
        elif type_id == self.TYPE_DATETIME:
            value_structure = self.DATETIME
        else:
            value_structure = self.TEXT

        try:
            value = value_structure.parse_stream(file_object)
        except (IOError, construct.FieldError) as exception:
            parser_mediator.ProduceExtractionError(
                'unable to parse value with error: {0!s}'.format(exception))
            return None, None

        if type_id in (self.TYPE_GENERAL_INTEGER, self.TYPE_INTEGER,
                       self.TYPE_ENUMERATION):
            value = value.integer

        elif type_id == self.TYPE_BOOL:
            value = bool(value.integer)

        elif type_id == self.TYPE_DATETIME:
            rfc2579_date_time_tuple = (value.year, value.month, value.day,
                                       value.hour, value.minutes,
                                       value.seconds, value.deciseconds,
                                       value.direction_from_utc,
                                       value.hours_from_utc,
                                       value.minutes_from_utc)
            value = dfdatetime_rfc2579_date_time.RFC2579DateTime(
                rfc2579_date_time_tuple=rfc2579_date_time_tuple)

        else:
            try:
                value = value.decode('utf-8')
            except UnicodeDecodeError as exception:
                parser_mediator.ProduceExtractionError(
                    'unable to decode value with error: {0!s}'.format(
                        exception))
                return None, None

        return name, value
    def testInitialize(self):
        """Tests the initialization function."""
        rfc2579_date_time_object = rfc2579_date_time.RFC2579DateTime()
        self.assertIsNotNone(rfc2579_date_time_object)

        rfc2579_date_time_object = rfc2579_date_time.RFC2579DateTime(
            rfc2579_date_time_tuple=(2010, 8, 12, 20, 6, 31, 6, '+', 2, 0))
        self.assertIsNotNone(rfc2579_date_time_object)
        self.assertEqual(rfc2579_date_time_object.year, 2010)
        self.assertEqual(rfc2579_date_time_object.month, 8)
        self.assertEqual(rfc2579_date_time_object.day_of_month, 12)
        self.assertEqual(rfc2579_date_time_object.hours, 20)
        self.assertEqual(rfc2579_date_time_object.minutes, 6)
        self.assertEqual(rfc2579_date_time_object.seconds, 31)
        self.assertEqual(rfc2579_date_time_object.deciseconds, 6)
        self.assertEqual(rfc2579_date_time_object.time_zone_offset, 120)

        with self.assertRaises(ValueError):
            rfc2579_date_time.RFC2579DateTime(rfc2579_date_time_tuple=(2010, 8,
                                                                       12, 20,
                                                                       6, 31))

        with self.assertRaises(ValueError):
            rfc2579_date_time.RFC2579DateTime(
                rfc2579_date_time_tuple=(65537, 8, 12, 20, 6, 31, 6, '+', 2,
                                         0))

        with self.assertRaises(ValueError):
            rfc2579_date_time.RFC2579DateTime(
                rfc2579_date_time_tuple=(2010, 13, 12, 20, 6, 31, 6, '+', 2,
                                         0))

        with self.assertRaises(ValueError):
            rfc2579_date_time.RFC2579DateTime(
                rfc2579_date_time_tuple=(2010, 8, 32, 20, 6, 31, 6, '+', 2, 0))

        with self.assertRaises(ValueError):
            rfc2579_date_time.RFC2579DateTime(
                rfc2579_date_time_tuple=(2010, 8, 12, 24, 6, 31, 6, '+', 2, 0))

        with self.assertRaises(ValueError):
            rfc2579_date_time.RFC2579DateTime(
                rfc2579_date_time_tuple=(2010, 8, 12, 20, 61, 31, 6, '+', 2,
                                         0))

        with self.assertRaises(ValueError):
            rfc2579_date_time.RFC2579DateTime(
                rfc2579_date_time_tuple=(2010, 8, 12, 20, 6, 61, 6, '+', 2, 0))

        with self.assertRaises(ValueError):
            rfc2579_date_time.RFC2579DateTime(
                rfc2579_date_time_tuple=(2010, 8, 12, 20, 6, 31, 11, '+', 2,
                                         0))

        with self.assertRaises(ValueError):
            rfc2579_date_time.RFC2579DateTime(
                rfc2579_date_time_tuple=(2010, 8, 12, 20, 6, 31, 6, '#', 2, 0))

        with self.assertRaises(ValueError):
            rfc2579_date_time.RFC2579DateTime(
                rfc2579_date_time_tuple=(2010, 8, 12, 20, 6, 31, 6, '+', 14,
                                         0))

        with self.assertRaises(ValueError):
            rfc2579_date_time.RFC2579DateTime(
                rfc2579_date_time_tuple=(2010, 8, 12, 20, 6, 31, 6, '+', 2,
                                         60))
    def testCopyFromDateTimeString(self):
        """Tests the CopyFromDateTimeString function."""
        rfc2579_date_time_object = rfc2579_date_time.RFC2579DateTime()

        rfc2579_date_time_object.CopyFromDateTimeString('2010-08-12')
        self.assertEqual(rfc2579_date_time_object._number_of_seconds,
                         1281571200)
        self.assertEqual(rfc2579_date_time_object._time_zone_offset, 0)
        self.assertEqual(rfc2579_date_time_object.year, 2010)
        self.assertEqual(rfc2579_date_time_object.month, 8)
        self.assertEqual(rfc2579_date_time_object.day_of_month, 12)
        self.assertEqual(rfc2579_date_time_object.hours, 0)
        self.assertEqual(rfc2579_date_time_object.minutes, 0)
        self.assertEqual(rfc2579_date_time_object.seconds, 0)
        self.assertEqual(rfc2579_date_time_object.deciseconds, 0)

        rfc2579_date_time_object.CopyFromDateTimeString('2010-08-12 21:06:31')
        self.assertEqual(rfc2579_date_time_object._number_of_seconds,
                         1281647191)
        self.assertEqual(rfc2579_date_time_object._time_zone_offset, 0)
        self.assertEqual(rfc2579_date_time_object.year, 2010)
        self.assertEqual(rfc2579_date_time_object.month, 8)
        self.assertEqual(rfc2579_date_time_object.day_of_month, 12)
        self.assertEqual(rfc2579_date_time_object.hours, 21)
        self.assertEqual(rfc2579_date_time_object.minutes, 6)
        self.assertEqual(rfc2579_date_time_object.seconds, 31)
        self.assertEqual(rfc2579_date_time_object.deciseconds, 0)

        rfc2579_date_time_object.CopyFromDateTimeString(
            '2010-08-12 21:06:31.546875')
        self.assertEqual(rfc2579_date_time_object._number_of_seconds,
                         1281647191)
        self.assertEqual(rfc2579_date_time_object._time_zone_offset, 0)
        self.assertEqual(rfc2579_date_time_object.year, 2010)
        self.assertEqual(rfc2579_date_time_object.month, 8)
        self.assertEqual(rfc2579_date_time_object.day_of_month, 12)
        self.assertEqual(rfc2579_date_time_object.hours, 21)
        self.assertEqual(rfc2579_date_time_object.minutes, 6)
        self.assertEqual(rfc2579_date_time_object.seconds, 31)
        self.assertEqual(rfc2579_date_time_object.deciseconds, 5)

        rfc2579_date_time_object.CopyFromDateTimeString(
            '2010-08-12 21:06:31.546875-01:00')
        self.assertEqual(rfc2579_date_time_object._number_of_seconds,
                         1281647191)
        self.assertEqual(rfc2579_date_time_object._time_zone_offset, -60)
        self.assertEqual(rfc2579_date_time_object.year, 2010)
        self.assertEqual(rfc2579_date_time_object.month, 8)
        self.assertEqual(rfc2579_date_time_object.day_of_month, 12)
        self.assertEqual(rfc2579_date_time_object.hours, 21)
        self.assertEqual(rfc2579_date_time_object.minutes, 6)
        self.assertEqual(rfc2579_date_time_object.seconds, 31)
        self.assertEqual(rfc2579_date_time_object.deciseconds, 5)
        self.assertEqual(rfc2579_date_time_object.time_zone_offset, -60)

        rfc2579_date_time_object.CopyFromDateTimeString(
            '2010-08-12 21:06:31.546875+01:00')
        self.assertEqual(rfc2579_date_time_object._number_of_seconds,
                         1281647191)
        self.assertEqual(rfc2579_date_time_object._time_zone_offset, 60)
        self.assertEqual(rfc2579_date_time_object.year, 2010)
        self.assertEqual(rfc2579_date_time_object.month, 8)
        self.assertEqual(rfc2579_date_time_object.day_of_month, 12)
        self.assertEqual(rfc2579_date_time_object.hours, 21)
        self.assertEqual(rfc2579_date_time_object.minutes, 6)
        self.assertEqual(rfc2579_date_time_object.seconds, 31)
        self.assertEqual(rfc2579_date_time_object.deciseconds, 5)
        self.assertEqual(rfc2579_date_time_object.time_zone_offset, 60)

        rfc2579_date_time_object.CopyFromDateTimeString('1601-01-02 00:00:00')
        self.assertEqual(rfc2579_date_time_object._number_of_seconds,
                         -11644387200)
        self.assertEqual(rfc2579_date_time_object._time_zone_offset, 0)
        self.assertEqual(rfc2579_date_time_object.year, 1601)
        self.assertEqual(rfc2579_date_time_object.month, 1)
        self.assertEqual(rfc2579_date_time_object.day_of_month, 2)
        self.assertEqual(rfc2579_date_time_object.hours, 0)
        self.assertEqual(rfc2579_date_time_object.minutes, 0)
        self.assertEqual(rfc2579_date_time_object.seconds, 0)
        self.assertEqual(rfc2579_date_time_object.deciseconds, 0)

        rfc2579_date_time_object = RFC2579DateTimeInvalidYear()

        with self.assertRaises(ValueError):
            rfc2579_date_time_object.CopyFromDateTimeString(
                '9999-01-02 00:00:00')
Example #7
0
    def testConvertDateTimeValuesToJSON(self):
        """Test ConvertDateTimeValuesToJSON function."""
        posix_time_object = posix_time.PosixTime(timestamp=1281643591)

        expected_json_dict = {
            '__class_name__': 'PosixTime',
            '__type__': 'DateTimeValues',
            'timestamp': 1281643591
        }

        json_dict = serializer.Serializer.ConvertDateTimeValuesToJSON(
            posix_time_object)
        self.assertEqual(json_dict, expected_json_dict)

        posix_time_object.is_local_time = True

        expected_json_dict = {
            '__class_name__': 'PosixTime',
            '__type__': 'DateTimeValues',
            'is_local_time': True,
            'timestamp': 1281643591
        }

        json_dict = serializer.Serializer.ConvertDateTimeValuesToJSON(
            posix_time_object)
        self.assertEqual(json_dict, expected_json_dict)

        never_time_object = semantic_time.Never()

        expected_json_dict = {
            '__class_name__': 'Never',
            '__type__': 'DateTimeValues',
            'string': 'Never'
        }

        json_dict = serializer.Serializer.ConvertDateTimeValuesToJSON(
            never_time_object)
        self.assertEqual(json_dict, expected_json_dict)

        fat_date_time_object = fat_date_time.FATDateTime(
            fat_date_time=0xa8d03d0c)

        expected_json_dict = {
            '__class_name__': 'FATDateTime',
            '__type__': 'DateTimeValues',
            'fat_date_time': 2832219404
        }

        json_dict = serializer.Serializer.ConvertDateTimeValuesToJSON(
            fat_date_time_object)
        self.assertEqual(json_dict, expected_json_dict)

        golang_timestamp = bytes.fromhex('01000000000000000200000003ffff')
        golang_time_object = golang_time.GolangTime(
            golang_timestamp=golang_timestamp)

        expected_json_dict = {
            '__class_name__':
            'GolangTime',
            '__type__':
            'DateTimeValues',
            'golang_timestamp':
            (b'\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x03\xff\xff'),
            'time_zone_offset':
            0
        }

        json_dict = serializer.Serializer.ConvertDateTimeValuesToJSON(
            golang_time_object)
        self.assertEqual(json_dict, expected_json_dict)

        rfc2579_date_time_object = rfc2579_date_time.RFC2579DateTime(
            rfc2579_date_time_tuple=(2010, 8, 12, 20, 6, 31, 6, '+', 2, 0))

        expected_json_dict = {
            '__class_name__': 'RFC2579DateTime',
            '__type__': 'DateTimeValues',
            'rfc2579_date_time_tuple': (2010, 8, 12, 20, 6, 31, 6),
            'time_zone_offset': 120
        }

        json_dict = serializer.Serializer.ConvertDateTimeValuesToJSON(
            rfc2579_date_time_object)
        self.assertEqual(json_dict, expected_json_dict)

        time_elements_object = time_elements.TimeElements(
            time_elements_tuple=(2010, 8, 12, 20, 6, 31))

        expected_json_dict = {
            '__class_name__': 'TimeElements',
            '__type__': 'DateTimeValues',
            'time_elements_tuple': (2010, 8, 12, 20, 6, 31)
        }

        json_dict = serializer.Serializer.ConvertDateTimeValuesToJSON(
            time_elements_object)
        self.assertEqual(json_dict, expected_json_dict)

        time_elements_object = time_elements.TimeElementsInMilliseconds(
            time_elements_tuple=(2010, 8, 12, 20, 6, 31, 546))

        expected_json_dict = {
            '__class_name__': 'TimeElementsInMilliseconds',
            '__type__': 'DateTimeValues',
            'time_elements_tuple': (2010, 8, 12, 20, 6, 31, 546)
        }

        json_dict = serializer.Serializer.ConvertDateTimeValuesToJSON(
            time_elements_object)
        self.assertEqual(json_dict, expected_json_dict)

        time_elements_object = time_elements.TimeElementsInMicroseconds(
            time_elements_tuple=(2010, 8, 12, 20, 6, 31, 429876))

        expected_json_dict = {
            '__class_name__': 'TimeElementsInMicroseconds',
            '__type__': 'DateTimeValues',
            'time_elements_tuple': (2010, 8, 12, 20, 6, 31, 429876)
        }

        json_dict = serializer.Serializer.ConvertDateTimeValuesToJSON(
            time_elements_object)
        self.assertEqual(json_dict, expected_json_dict)